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に設定し
今日のカウントを更新するようにします。
Copyright 1997-2010 BBB All rights reserved.