[PHP-users 31827] Re: 1970年以前の指定日から現在まで何日経過しているか確認する方法

takay takay.ml @ gmail.com
2007年 4月 5日 (木) 11:51:36 JST


takayです。
#うるう年計算思いっきり間違ってました。^^;

> 計算する年が歴史的な年で1582年をまたぐ場合には注意が必要です。
> カトリックの国々では、1582年10月5日〜10月14日は、存在しません。

…も加味した修正コードです(ほんと、あってんのかな?^^;)

function days($ymd, $sep) {
    $md = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    $buf = explode($sep, $ymd);
    $year = $buf[0] + 0;
    $month = $buf[1] + 0;
    $day = $buf[2] + 0;

    if ( !checkdate($month, $day, $year) ) return false;
    if ( $year == 1582 && $month == 10 )
        if ( $day > 4 && $day < 15 ) return false; // ユリウス暦とグレゴリオ暦の間の日付

    // 単純日数計算
    $days = $year * 365;
    for ( $i = ($month - 2) ; $i >= 0 ; $i-- ) $days += $md[$i];
    $days += $day;

    // うるう年加算
    $days += floor(($year - 1) / 4);        /* 4年に1度はうるう年 */
    $days -= floor(($year - 1) / 100);      /* 100年に1度は平年 */
    $days += floor(($year - 1) / 400);      /* 400年に1度はうるう年 */
    $uru = 0;
    if ( $year % 4 == 0 ) { /* 4年に1度はうるう年 */
        $uru = 1;
        if ( $year % 100 == 0 ) { /* 100年に1度は平年 */
            $uru = 0;
            if ( $year % 400 == 0 ) { /* 400年に1度はうるう年 */
                $uru = 1;
            }
        }
    }
    if ( $uru == 1 && ( $month > 2 || ($month == 2 && $day == 29) ) ) $days += $uru;


    // ユリウス暦とグレゴリオ暦の間の日付を取り除く
    if ( $days >= 578091 ) $days -= 10;

    return $days;
}


---
takay.ml @ gmail.com




PHP-users メーリングリストの案内