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.
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
Haben Sie versucht, alle Warnungen auf Ihrem Server zu aktivieren? d.h. 'error_reporting (-1); ini_set ('display_errors', 'On'); ' –