7

私と一緒に仕事をしていない人がまとめた会議室の予約カレンダーをデバッグしています。非常に多くの問題があったので悪夢のようでしたが、この最後のバグの原因を正確に突き止めるのに苦労しています. カレンダーは、部屋が特定の時間にすでに予約されているかどうかを確認し、適切な時間に予約済みとして表示される問題が発生していないことを確認します。 DST へのシフト、または DST からのシフトでは、まだ予約済みの部屋が表示されます。例:

  • ユーザーは、部屋が 11 月 29 日の午前 9 時から午前 10 時まで予約されていることを確認します。
  • 次に、ユーザーは 11 月 29 日の午前 10 時 30 分から午後 12 時までの部屋を予約しようとします。
  • カレンダーはこの 2 番目の要求をキャンセルし、部屋が既に予約されていることをユーザーに通知します。

これは、DST への移行前 (11 月 4 日) には発生しないことに注意してください。部屋が利用可能かどうかを判断する関数は次のとおりです。

    function calCheck($starttime, $endtime, $cal_name, $cat_id, $myDB, $myHost, $myUser, $myPass) {
    $timezone = 'America/Denver';
    date_default_timezone_set ($timezone);
    $dset = new DateTime($odate, new DateTimeZone($timezone));
    $dset2 = $dset->getOffset();

    //$starttime = $starttime + 1;
    //$endtime = $endtime  - 1;     
    $starttime = $starttime - $dset2 + 1;
    $endtime = $endtime - $dset2 - 1;
    $starttime = $starttime;
    $endtime = $endtime; 

    //echo $starttime .'</br>'. $endtime . '</br>';
    $db = new myDB($myDB, $myHost, $myUser, $myPass);
    $db->myDB_Connect();
    //echo 'calcheck</br>';
    $ck_query = 'SELECT * FROM vw_cal_chk 
                    WHERE (stime < '. $starttime . '  AND etime > ' . $starttime . ' ) and Calendar = "' . $cal_name . '" and cat_id = "' .$cat_id . '"
                    OR (stime < ' . $endtime . ' AND etime > ' . $endtime . ') and Calendar = "' . $cal_name . '" and cat_id = "' .$cat_id . '"
                    OR (stime >= '. $starttime . ' AND etime < ' . $endtime .') and Calendar = "' . $cal_name . '" and cat_id = "' .$cat_id . '"';
    $ck_result = $db->myQuery($ck_query);
    $num = mysql_num_rows($ck_result);  
    //echo $ck_query . '</br>' . $num;
    if ($num >> 0){
        $avail = 1;
    } else {
        $avail = 0;
    }
    return $avail;
}

この時点までのすべてのタイムスタンプは UTC であり、$odate変数が実際にはどこにもインスタンス化されていないことに気付きましたが、オフセットが正しく機能するためにどの値を渡すかを決定できませんでした。それがどんな日付を望んでいるかを知ることができれば、残りを解決できるはずです.

4

1 に答える 1

1

$odate is null which defaults to now giving you the current offset. What you want is the offset at the time that the schedule is being set not the offset right at this moment. It looks like your database dates are in Mountain time and that your startdate is utc and you are subtracting the offset to get back to mountain (I would think that you would add the offsets not subtract , so I might have this reversed, can you query your database and figure it out?)

In any event you should be computing your offset using $startdate not now(), try switching $startdate for $odate and see what happens. If this doesn't work try building a string from startdate and then generating a new date from that string. If nothing else outputting that string should give you a clear picture as to whether $startdate is UTC or mountain

于 2012-12-28T18:42:32.127 に答える