2

毎週月曜日に反復処理を行う php スクリプトを作成しています。

しかし、10 月 22 日以降、スクリプトは同期していないように見えました。

<?php

$october_8th = strtotime("2012-10-08");

$one_week = 7 * 24 * 60 * 60;

$october_15th = $october_8th + $one_week;
$october_22nd = $october_15th + $one_week;
$october_29th = $october_22nd + $one_week;
$november_5th = $october_29th + $one_week;

echo date("Y-m-d -> l", $october_8th) . '<br />';
echo date("Y-m-d -> l", $october_15th) . '<br />';
echo date("Y-m-d -> l", $october_22nd) . '<br />';
echo date("Y-m-d -> l", $october_29th) . '<br />';
echo date("Y-m-d -> l", $november_5th) . '<br />';

これは次のように出力されます。

2012-10-08 -> Monday
2012-10-15 -> Monday
2012-10-22 -> Monday
2012-10-28 -> Sunday
2012-11-04 -> Sunday

10 月 29 日になると予想していましたが、28 日で止まってしまいました。

この問題を回避するにはどうすればよいですか?

4

2 に答える 2

5

推奨される選択は、PHPの日付関連クラスを使用して日付を取得することです。

これらのクラスは、Unixタイムスタンプ(使用した秒数)に指定された秒数を手動で追加できない方法で、夏時間の境界を重要に処理しstrtotime()ます。

次の例では、開始日を取得して4回ループし、そのたびに日付に1週間を追加します。

$start_date  = new DateTime('2012-10-08');
$interval    = new DateInterval('P1W');
$recurrences = 4;

foreach (new DatePeriod($start_date, $interval, $recurrences) as $date) {
    echo $date->format('Y-m-d -> l') . '<br/>';
}

PHPマニュアルリンク:

于 2012-07-28T13:04:45.640 に答える
1

この質問を書いているときに、夏時間が 10 月 28 日に終了することを発見しました。

初期化時の日付には特定の時刻が含まれていないため、自動的に午前 0 時が割り当てられます。ただし、夏が終わると問題が発生します。突然、時刻が真夜中ではなくなり、その 1 時間前になり、予想よりも 1 日早くなります。

簡単な修正は、時刻を真夜中ではなく正午に初期化することです。

$october_8th = strtotime("2012-10-08 12:00");

おそらくもっと洗練された解決策があるかもしれません (1 つ残しておいてもかまいません) が、この目的にはこれで十分です。

于 2012-07-28T12:05:26.527 に答える