2012-10-08 5 views
7

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.

+3

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

+0

Hai provato a abilitare tutti gli avvisi sul tuo server? vale a dire error_reporting (-1); ini_set ('display_errors', 'On'); ' –

risposta

1

$ odate è nullo, che per impostazione predefinita ora fornisce l'offset corrente. Quello che vuoi è lo scostamento nel momento in cui la pianificazione viene impostata non l'offset corretto in questo momento. Sembra che le date del tuo database siano in Mountain time e che il tuo startdate sia utc e stai sottraendo l'offset per tornare in montagna (penserei che aggiungerei gli offset non sottraggono, quindi potrei averlo invertito, puoi fare una query il tuo database e capirlo?)

In ogni caso dovresti calcolare il tuo offset usando $ startdate non ora(), prova a cambiare $ startdate per $ odate e vedere cosa succede. Se ciò non funziona, prova a creare una stringa da startdate e quindi a generare una nuova data da quella stringa. Se nient'altro che trasmette quella stringa dovrebbe darti una chiara immagine se $ startdate è UTC o montagna