C++
 Computer >> コンピューター >  >> プログラミング >> C++

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日ずつ数える方法と異なり、この方法は日付の間隔に依存せず、常に定数時間で結果を求められます。
  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

  2. Pythonで2つの日付の間の日数を求める方法

    2つの日付の間の日数を求めるには、Pythonの標準ライブラリである datetime モジュールを使用します。datetime モジュールには日付を扱うための date クラスが用意されており、dateオブジェクト同士を減算すると、その差が timedelta オブジェクトとして返されます。このオブジェクトの days 属性を参照することで、日数を簡単に取得できます。手順1:必要なライブラリをインポートするまず、datetime モジュールから date クラスをインポートします。from datetime import date手順2:dateオブジェクトを作成する次に、日数を計算したい2