2012-10-08 8 views
7

私はもはや私と一緒に働いていない人によってまとめられた会議室予約カレンダーをデバッグしています。非常に多くのことが間違っていたので、それは悪夢でしたが、私はこの最後のバグの原因を正確に突き止めることができません。カレンダーは、特定の時間に予約されている部屋があるかどうかをチェックし、適切な時間に予約されているような問題は表示されていませんが、ルームが空いてから1時間以内に同じ部屋を予約しようとすると、 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変数が実際にどこにもインスタンス化されることはありません気付いたが、私は決定することができていませんオフセットが正しく機能するためにはどの値を渡すべきか。私はそれがどんな種類の日付を望んでいるかを知ることができれば、残りの部分を作業することができます。

+3

$ odateが設定されていないようです。これは、DateTimeの呼び出しにNULLが渡されることを意味します)を既定の 'now'として処理する必要があります。日付( 'I')を使用してDSTをテストし、それに従ってオフセットをオフセットすることができます。 – Gavin

+0

サーバー上のすべての警告を有効にしましたか?すなわち、 'error_reporting(-1); ini_set( 'display_errors'、 'On'); ' –

答えて

1

$ odateは現在デフォルトで現在のオフセットを与えるnullです。あなたが望むのは、スケジュールがこの時点でオフセットではなく設定されているときのオフセットです。あなたのデータベースの日付は山岳時間で、あなたの出発日はutcで、あなたは山に戻るためにオフセットを減算しているようです(私はあなたがオフセットを減算しないと考えるでしょう。

いずれにしても、$ startdate not now()を使用してオフセットを計算する必要がある場合は、$ odateに$ startdateを切り替えて、何が起こるかを確認してみてください。これが機能しない場合は、startdateから文字列を作成し、その文字列から新しい日付を生成してみてください。その文字列を出力するものが何もない場合は、$ startdateがUTCか山かを明確に示す必要があります。

関連する問題