ジョン・コンデの答えは正しいですが、より効率的で数学的な解決策は次のとおりです。
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
$days = $start->diff($end, true)->days;
$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);
echo $sundays;
分解してみましょう。
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
最初に、まさにこの種の問題のための強力な組み込み PHP オブジェクトであるDateTimeオブジェクトをいくつか作成します。
$days = $start->diff($end, true)->days;
次に、DateTime::diff$start
を使用してtoとの差を見つけ$end
(2 番目のパラメーターとしてここを渡すtrue
と、この値が常に正になることが保証されます)、それらの間の日数を取得します。
$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);
ここで大きな問題が発生しますが、それほど複雑ではありません。まず、毎週日曜日が 1 つあることがわかっているため、最初は少なくとも$days / 7
日曜日があり、 で最も近いものに切り捨てられint
ますintval
。
その上、1 週間未満の期間に日曜日が存在する可能性があります。たとえば、金曜日から翌週の月曜日には 4 日が含まれます。そのうちの1つは日曜日です。したがって、いつ開始して終了するかによって、別の可能性があります。これは簡単に説明できます。
$start->format('N')
( DateTime::formatを参照) は、開始日のISO-8601曜日を示します。これは 1 から 7 までの数字です (1 は月曜日、7 は日曜日)。
$days % 7
週に均等に分割されない残りの日数を示します。
開始日と残りの日数の合計が 7 日以上になると、日曜日に達します。それを知っているので、その式を追加するだけで、値に追加しているので、それ1
が真か0
偽かがわかりますint
。
そして、あなたはそれを持っています!この方法の利点は、指定された時刻の間を毎日反復して日曜日かどうかを確認する必要がないことです。これにより、計算が大幅に節約され、非常に賢く見えるようになります。それが役立つことを願っています!