C++で2つの日付間の日数を計算する方法【効率的なアルゴリズム解説】
この記事では、日付を表す3つの整数(DD-MM-YYYY形式)からなる2つの配列 date1[] と date2[] が与えられたとき、その2つの日付の間の日数を求める方法を解説します。
問題を理解するための例
入力
date1[] = {13, 3, 2021}, date2[] = {24, 5, 2023}
出力
802
説明
2つの日付の差は「2年」と「2か月(3月〜5月)」、そして「11日」です。これを日数に換算すると以下のようになります。
2 × 365 + (30 + 31) + 11 = 802
解法アプローチ
単純なアプローチ(ループによる方法)
最もシンプルな解決策は、開始日 date1 から終了日 date2 まで1日ずつループでカウントしていく方法です。この方法でも正しい結果は得られますが、期間が長い場合には処理に時間がかかり、非効率になります。
効率的なアプローチ
より効率的な方法は、基準日(0000年1月1日)から各日付までの通算日数をそれぞれ計算し、その絶対差を求めることです。こうすることで、日付の間隔に関わらず一定の計算量で結果を得られます。
基準日からある日付までの通算日数は、次の3つの要素に分けて計算します。
年(YEAR)の計算
対象年の初日までの日数は、以下の式で求められます。
日数 = 365 × 年数 + うるう年の数
うるう年の判定には、グレゴリオ暦の規則(4で割り切れる年はうるう年、ただし100で割り切れる年は平年、400で割り切れる年はうるう年)を使用します。
月(MONTH)の計算
月初めの1日までの日数は、あらかじめ用意した月ごとの累積日数配列から取得します。
日数 = monthDays[月]
monthDays 配列には、各月までの累積日数が格納されており、配列参照だけで即座に値を取り出せます。
日(DATE)の計算
さらに、その月の日付部分(何日目か)を加算します。
以上の3要素を合計すると、その日付までの通算日数が求まります。2つの日付それぞれについて通算日数を計算し、その差の絶対値を取れば、それが求める答えとなります。
プログラム例
以下は、この解法の動作を示すC++プログラムです。
#include <iostream>
#include <math.h>
using namespace std;
const int monthDays[12] = { 31, 59, 90, 120, 151, 181, 212, 243,
273, 304, 334, 365 };
int countLeapYearDays(int d[]){
int years = d[2];
if (d[1] <= 2)
years--;
return ( (years / 4) - (years / 100) + (years / 400) );
}
int countNoOfDays(int date1[], int date2[]){
long int dayCount1 = (date1[2] * 365);
dayCount1 += monthDays[date1[1]];
dayCount1 += date1[0];
dayCount1 += countLeapYearDays(date1);
long int dayCount2 = (date2[2] * 365);
dayCount2 += monthDays[date2[1]];
dayCount2 += date2[0];
dayCount2 += countLeapYearDays(date2);
return ( abs(dayCount1 - dayCount2) );
}
int main(){
int date1[3] = {13, 3, 2021};
int date2[3] = {24, 5, 2023};
cout<<"The number of days between two dates is "<<countNoOfDays(date1, date2);
return 0;
}
出力
The number of days between two dates is 802
コードのポイント
- countLeapYearDays関数: 1月・2月の場合はまだその年の2月29日が到来していないため、年数を1減らしてからうるう年数を計算しています。
- monthDays配列: 各月までの累積日数を格納しておくことで、月ごとの日数計算をO(1)で行えます。
- 計算量: ループで1日ずつ数える方法と異なり、この方法は日付の間隔に依存せず、常に定数時間で結果を求められます。
-
PHPで2つの日付間の日数を求める方法|date_diff関数の使い方を解説
PHPでは、date_diff関数を使うことで、指定した2つの日付の差(日数)を簡単に求めることができます。この関数は組み込み関数であり、日数の差が正常に計算できた場合にはDateIntervalオブジェクトを返し、計算できなかった場合にはfalseを返します。 サンプルコード <?php $date_1 = date_create('23-11-2019'); $date_2 = date_create('22-1-2020'); $day_diff = date_diff($date_1, $date_2); echo $day_diff->f
-
Pythonで2つの日付の間の日数を求める方法
2つの日付の間の日数を求めるには、Pythonの標準ライブラリである datetime モジュールを使用します。datetime モジュールには日付を扱うための date クラスが用意されており、dateオブジェクト同士を減算すると、その差が timedelta オブジェクトとして返されます。このオブジェクトの days 属性を参照することで、日数を簡単に取得できます。手順1:必要なライブラリをインポートするまず、datetime モジュールから date クラスをインポートします。from datetime import date手順2:dateオブジェクトを作成する次に、日数を計算したい2