2012-10-08 6 views
7

Jestem debugowania kalendarza rezerwacji sali konferencyjnej, który został złożony przez kogoś, który już ze mną nie pracuje. To był koszmar, ponieważ było w nim tak wiele problemów, ale mam problem z ustaleniem przyczyny tego ostatniego błędu. Kalendarz sprawdza, czy pokoje zostały już zarezerwowane w określonych godzinach i czy nie mają problemu z rezerwacją w odpowiednim czasie, ale jeśli ktoś spróbuje zarezerwować ten sam pokój godzinę lub krócej po opuszczeniu pokoju po przesunięcie do lub z DST, pokazuje pokój jako zarezerwowany jeszcze. Przykład:Funkcja w kodzie I debugowanie wydaje się nie uwzględniać zmian do iz DST

  • Użytkownik widzi, że pokój jest zarezerwowany na 29 listopada od 9:00 do 10:00.
  • Użytkownik próbuje następnie zarezerwować pokój 29 listopada od 10:30 do 12:00.
  • Kalendarz anuluje to drugie żądanie i informuje użytkownika, że ​​pokój jest już zarezerwowany.

Należy zauważyć, że tak się nie stanie w żadnym momencie przed przejściem na DST (4 listopada). Oto funkcja, która określa, czy pokój jest dostępny:

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

Wszystkie moje znaczników czasu do tej pory są w UTC i zauważam zmienna $odate faktycznie nigdy wystąpienia w dowolnym miejscu, ale nie byli w stanie określić, jaką wartość przesłać, aby offset działał poprawnie. Jeśli uda mi się ustalić, jakiego rodzaju dnia chce, powinienem móc odpracować resztę.

+3

wygląda mi $ Odate jest wyłączony, co oznacza wezwanie do DateTime jest przekazywana zerowy, który podejrzewam (jeśli działa w ogóle) musi być przetwarzany jako domyślny "teraz". Możesz przetestować DST, używając daty ("I"), a następnie odpowiednio zrównoważyć swoje przesunięcia. – Gavin

+0

Czy próbowałeś włączyć wszystkie ostrzeżenia na swoim serwerze? tj. 'error_reporting (-1); ini_set ('display_errors', 'On'); ' –

Odpowiedz

1

$ odate ma wartość null, która domyślnie podaje bieżące przesunięcie. To, czego chcesz, to przesunięcie w czasie, gdy harmonogram jest ustawiany, a nie offset w tej chwili. Wygląda na to, że daty twojej bazy danych są w czasie Mountain i że twoja data początkowa jest utc i odejmujesz przesunięcie, aby wrócić do góry (myślę, że dodasz przesunięcia, które nie zostaną odjęte, więc mogę to odwrócić, czy możesz zapytać twoja baza danych i wymyślić to?)

W każdym przypadku powinieneś obliczać swoje offsety za pomocą $ startdate not now(), spróbuj zmienić $ startdate na $ odate i zobacz, co się stanie. Jeśli to nie działa, spróbuj zbudować ciąg znaków od startdate, a następnie wygeneruj nową datę z tego łańcucha. Jeżeli nic innego wyprowadzanie ten ciąg powinien dać jasny obraz tego, czy $ StartDate jest UTC lub góra

Powiązane problemy