更新日チェック(zeller[ツェラー]の公式,datediff)

メモ:  Category:php

phpでは、日付の差をとる関数が提供されていません。(PEARでは用意されているようです。)

そこで、個人的趣味というか記憶の保管のため日付の差をとる関数を作成します。

この関数を使って、カウントされた日付と最終更新日の差をとります。差が1日なら、昨日のカウントに今日までのカウントを移します。

さて、問題の関数ですが Zeller(ツェラー)の公式 というものを使用します。Zeller(ツェラー)の公式は、曜日を求めるもので以前使ったことがあります。

詳しくは、他のサイトを参考にしていただくとしてグレゴリウス暦 0年1月1日 を基準として日数を計算します。対象に日付が1月または2月の場合、これらの月は13月、14月として計算します。また、年もマイナス1して計算をします。

(1)グレゴリウス暦 0年1月1日 から対象年 1月1日 までの日数を計算します。

365 * 対象年 + 対象年 / 4 - 対象年 / 100 + 対象年 / 400

例:2005/04/10の場合
365 * 2005 + 2005 / 4 - 2005 / 100 + 2005 / 400 = 732311

例:2005/01/10の場合
365 * 2004 + 2004 / 4 - 2004 / 100 + 2004 / 400 = 731946

(2)対象年の1月1から対象日までの日数を計算します。

30 * 対象月 + (対象月 + 1) * 3 / 5 + 対象日 - 33

例:2005/04/10の場合
30 * 4 + (4 + 1) * 3 / 5 + 10 - 33 = 100

例:2005/01/10の場合
30 * 13 + (13 + 1) * 3 / 5 + 10 - 33 = 375

(1)と(2)で算出した結果を合計すると基準日からの日数がもとまります。

これを元に経過日数を計算する関数と、その差をとる関数を用意します。

function Date2day($year,$month,$day){
    if($month < 3){
        $year--;
        $month += 12;
    }
    return (integer)(365 * $year + $year / 4 - $year / 100 + $year / 400 + (153 * $month - 447) / 5 + $day);
}
function Datediff($year1,$month1,$day1,$year2,$month2,$day2){

    if(!checkdate($month1,$day1,$year1)) return;
    if(!checkdate($month2,$day2,$year2)) return;

    return (Date2day($year1,$month1,$day1) - Date2day($year2,$month2,$day2));
}

計算式が違いますが、これはC言語のときの拾い物を使っています。

上記関数を使って更新日と現在の日付の差をとります。2以上の開きがある場合、昨日を0に設定し今日のカウントを更新するようにします。

bluenote by BBB