Sto eseguendo il debug di un calendario di prenotazione di una sala conferenze che è stato creato da qualcuno che non lavora più con me. È stato un incubo visto che c'erano così tante cose sbagliate, ma ho difficoltà a capire esattamente cosa sta causando l'ultimo bug. Il calendario controlla se le camere sono già state prenotate in determinati orari e non hanno un problema che mostra come prenotato al momento giusto, ma se qualcuno cerca di prenotare la stessa stanza un'ora o meno dopo che la stanza è stata liberata dopo un passa ao da DST, mostra la stanza come prenotata ancora. Esempio:La funzione nel codice che sto eseguendo il debug sembra non tenere conto dei turni da e verso l'ora legale
- L'utente vede che una stanza è riservata per il 29 novembre dalle 9:00 alle 10:00.
- L'utente prova quindi a prenotare la camera il 29 novembre dalle 10:30 alle 12:00.
- Il calendario annulla questa seconda richiesta e informa l'utente che la stanza è già prenotata.
Va notato che ciò non accade in qualsiasi momento prima del passaggio all'ora legale (4 novembre). Ecco la funzione che determina se la stanza è disponibile:
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;
}
Tutti i miei timestamp fino a questo punto sono in UTC e noto la variabile $odate
è in realtà mai istanziato da nessuna parte, ma non sono stato in grado di determinare che valore passare per consentire il corretto funzionamento dell'offset. Se riesco a scoprire che tipo di data vuole, dovrei essere in grado di lavorare il resto.
mi sembra come $ odate è disinserito il che significa che la chiamata a DateTime è passata null che sospetto (se funziona a tutti) deve essere elaborato come predefinito 'now'. È possibile verificare l'ora legale utilizzando la data ("I") e quindi compensare gli offset di conseguenza. – Gavin
Hai provato a abilitare tutti gli avvisi sul tuo server? vale a dire error_reporting (-1); ini_set ('display_errors', 'On'); ' –