0

ウィークリー ビュー カレンダーを作成していますが、時計が進む 10 月 28 日になると問題が発生します。カレンダーが1日ずれます

これまでの私のコード...

//get viewed date from form and add either a week to it or take a week away
        if(isset($_POST['add_week'])){
                $last_week_ts = strtotime($_POST['last_week']);
                $display_week_ts = $last_week_ts + (3600 * 24 * 7);
        } else if (isset($_POST['back_week'])) {
                $last_week_ts = strtotime($_POST['last_week']);
                $display_week_ts = $last_week_ts - (3600 * 24 * 7);
        } else {
                //sets the current day as the first day of the week so no good
                /*$display_week_ts = floor(time() / (3600 * 24)) * 3600 * 24;*/

                //Does't account for british summer time so days are out after 28th October
                $display_week_ts = strtotime("Monday noon");
        }

              $week_start = new DateTime(date("Y-m-d", $display_week_ts));

           for ($i = 0; $i < 7; $i++)  
       {
            echo '<td class="day">';
            $current_day_ts = $display_week_ts + ($i * 3600 *24);
            $daily_date = date('d-m-Y', $current_day_ts);
            $StartDate =  date('d', $current_day_ts);
            $MonthName = date('m', $current_day_ts);
            $Year = date('Y', $current_day_ts);
                            echo $daily_date;
                            echo '</td>';
        }

$week_start には、現在カレンダーに表示されている週の始まりの値が含まれています。初めて開くと、現在の週が表示されます。次の週のボタンが押された場合、$week_start 値に 1 週​​間が追加されます。現在、テーブルの非表示フィールドに保存され、送信時にポストバックされます。$week_start を TimeDate() オブジェクトとしてセッションに格納しようとしました

        $week_start = new DateTime(date("Y-m-d", $display_week_ts));
        $S_SESSION['week_start'] = $week_start;

しかし、セッションをコールバックして使用しようとすると、1週間前に移動します

        $week_start = $S_SESSION['week_start'];
        $week_start->modify('+1 week');

「警告: DateTime::modify() [datetime.modify]: DateTime オブジェクトがコンストラクターによって正しく初期化されていません」というエラーが表示されます。掘り下げた後、DateTimeは5.3までセッションをサポートしていないようで、5.2.17を使用していることがわかりました

BST が問題を引き起こさないように、変数 $week_start を $display_week_ts で表される週の最初の曜日にする方法を誰かが教えてくれたら本当にありがたいです。私はこれに3日間しっかりと取り組んできました

4

2 に答える 2

1

使用するdate_default_timezone_set('UTC');

また $week_start->setTimezone(new DateTimeZone('UTC'));

于 2012-09-05T14:20:51.427 に答える
0

これが問題です:

$display_week_ts = $last_week_ts + (3600 * 24 * 7);

DST の変更を行っているため、1 週間は3600*24*7 秒ではなく、実際には 3600*24*7 - 3600 です。DSTシフトから 1 時間を失っているため、実際には先に進んでいます。 8日。そして、前の週の計算にも同じことが当てはまります。つまり、1 時間を失い、6 日しか戻らないことになります。

これらの種類の計算を安全に行うには、これらの種類の計算に適切な DateIntervals を指定して DateTime オブジェクトを使用する必要があります。DST の変更が考慮されます。

例えば

$now = new DateTime();
$now->setTimeZone(new DateTimeZone('Whatever/Wherever'));

$oneweek = new DateInterval('P7D');
$nextweek = $now->add($oneweek);
$lastweek = $now->sub($oneweek);
于 2012-09-05T14:28:10.290 に答える