2012-10-08 5 views
7

Ich debugging ein Konferenzraum Buchungskalender, die von jemandem zusammengestellt wurde, die nicht mehr mit mir arbeitet. Es war ein Albtraum, da so viele Dinge nicht in Ordnung waren, aber ich habe Schwierigkeiten herauszufinden, was genau diesen letzten Fehler verursacht hat. Der Kalender prüft, ob Zimmer zu bestimmten Zeiten bereits gebucht wurden und sie kein Problem haben, das zur richtigen Zeit gebucht wird, aber wenn jemand versucht, das gleiche Zimmer eine Stunde oder weniger nach dem Verlassen des Zimmers zu buchen Verschiebung nach oder von DST, zeigt den Raum wie gebucht. Beispiel:Funktion in Code Ich bin Debugging scheint nicht zu berücksichtigen Verschiebungen nach und von DST

  • Benutzer sieht, dass ein Raum für 29. November von 09.00 bis 10.00 Uhr reserviert.
  • Benutzer versucht dann das Zimmer am 29. November von 10:30 Uhr bis 12:00 Uhr zu buchen.
  • Der Kalender bricht diese zweite Anfrage ab und informiert den Benutzer, dass das Zimmer bereits gebucht ist.

Es sollte beachtet werden, dass dies nicht vor der Umstellung auf DST (4. November) geschieht. Hier ist die Funktion, die bestimmt, ob der Raum steht zur Verfügung:

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; 
} 

All meiner Zeitstempel bis zu diesem Punkt sind in UTC und ich merke, das $odate Variable ist eigentlich nie irgendwo instanziiert, aber ich habe nicht in der Lage zu bestimmen, Welchen Wert sollte es übergeben, damit der Ausgleich korrekt funktioniert? Wenn ich herausfinden kann, welche Art von Datum es will, sollte ich in der Lage sein, den Rest auszuarbeiten.

+3

sieht mir aus wie $ odate ist nicht festgelegt, was bedeutet, dass der Aufruf an DateTime Null übergeben wird, die ich vermute (wenn es überhaupt funktioniert) muss als 'jetzt' verarbeitet werden. Sie können auf DST mit Datum ('I') testen und dann Ihre Offsets entsprechend versetzen. – Gavin

+0

Haben Sie versucht, alle Warnungen auf Ihrem Server zu aktivieren? d.h. 'error_reporting (-1); ini_set ('display_errors', 'On'); ' –

Antwort

1

$ odate ist null, das standardmäßig den aktuellen Offset angibt. Was Sie wollen, ist der Versatz zu dem Zeitpunkt, zu dem der Zeitplan eingestellt wird, nicht der Versatz in diesem Moment. Es sieht so aus, als wären Ihre Datenbankdaten in Mountain time und Ihr Startdatum ist utc und Sie subtrahieren den Offset, um zurück zum Berg zu kommen (ich würde denken, dass Sie die Offsets nicht subtrahieren würden, also könnte ich das umgekehrt haben, können Sie abfragen Ihre Datenbank und finde es heraus?)

In jedem Fall sollten Sie Ihren Offset mit $ startdate not now() berechnen, versuchen, $ Startdatum für $ odate zu wechseln und sehen, was passiert. Wenn dies nicht funktioniert, versuchen Sie, eine Zeichenfolge von startdate zu erstellen und dann ein neues Datum aus dieser Zeichenfolge zu generieren. Wenn nichts anderes Ausgabe dieser Zeichenfolge sollte Ihnen ein klares Bild, ob $ Startdatum ist UTC oder Berg