Last Updated 2012/02/21
 Programming Tips  ロジック  索 引 
経過日数
2012/02/21

プログラム組んでいるとよく日付計算が必要になる。
ある日からある日まで何日たったか?ってやつ。何日経過したか?ってやつ。
MFC に CTimeDiff クラスがあって簡単に計算出来ればいいけど,そういったクラスや関数がない場合もある。

ある日から月末は何日まであって,それが何ヶ月あって....って考えるとロジックが大変になる。

こう考えると簡単。
考え方は 1900/1/1 からの経過日数を出して,それ同士で引き算すると出る。

perl で書いてるけど,ロジックそのものはどんな環境でも問題ないはず。

$iStart = GetDays( 2012, 2, 3 );
$iEnd = GetDays( 2012, 5, 5 );
$DiffDays = $iEnd - $iStart;


sub GetDays
{
    my( $iYear ) = $_[ 0 ];             # 年
    my( $iMonth ) = $_[ 1 ];            # 月
    my( $iDay ) = $_[ 2 ];              # 日
    my( $iDays );                       # 経過日数
    my( $iYearLoop );                   # 年ループ
    my( $iMonthLoop );                  # 月ループ

    if( $iYear < 1900 ) {
        return 0;
    }

    $iDays = 0;
    for( $iYearLoop = 1900; $iYearLoop < $iYear; $iYearLoop++ ) {
        $iDays += 365;
        # 閏年
        $iDays += ($iYearLoop % 4 == 0 and ($iYearLoop % 400 == 0 or $iYearLoop % 100 != 0));
    }
    for( $iMonthLoop = 1; $iMonthLoop < $iMonth; $iMonthLoop++ ) {
        $iDays += (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$iMonthLoop - 1];
        # 閏年
        $iDays += $iMonthLoop == 2 and ($iYear % 4 == 0 and ($iYear % 400 == 0 or $iYear % 100 != 0));
    }
    $iDays += ($iDay - 1);

    return $iDays;
}


参照
前後のTips
経過日数

DSS ProgrammingTipsCGI Ver2.00