2012-10-08 12 views
7

Tôi đang gỡ lỗi lịch đặt phòng hội nghị do một người không còn làm việc với tôi nữa. Đó là một cơn ác mộng vì có rất nhiều điều sai trái với nó, nhưng tôi đang gặp khó khăn trong việc tìm ra chính xác nguyên nhân gây ra lỗi cuối cùng này. Lịch kiểm tra xem các phòng đã được đặt vào một số thời điểm nhất định và không có vấn đề hiển thị như được đặt vào đúng thời điểm, nhưng nếu ai đó cố gắng đặt cùng một phòng một giờ hoặc ít hơn sau khi phòng trống sau chuyển đến hoặc từ DST, nó cho thấy phòng như được đặt vẫn còn. Ví dụ:Chức năng trong mã Tôi đang gỡ lỗi dường như không tính đến các thay đổi đến và đi từ DST

  • Người dùng thấy phòng được đặt trước ngày 29 tháng 11 từ 9 giờ sáng đến 10 giờ sáng.
  • Người dùng sau đó cố gắng đặt phòng vào ngày 29 tháng 11 từ 10:30 sáng đến 12:00 tối.
  • Lịch hủy yêu cầu thứ hai này và thông báo cho người dùng rằng phòng đã được đặt.

Cần lưu ý rằng điều này không xảy ra bất kỳ lúc nào trước khi chuyển sang DST (ngày 4 tháng 11). Dưới đây là những chức năng mà quyết định nếu căn phòng có sẵn:

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

Tất cả các timestamps của tôi đến thời điểm này là ở tính theo giờ UTC và tôi nhận thấy sự biến $odate là thực sự không bao giờ instantiated bất cứ nơi nào, nhưng tôi đã không thể xác định những gì giá trị để vượt qua nó để cho bù đắp để hoạt động chính xác. Nếu tôi có thể tìm ra loại ngày mà nó muốn, tôi sẽ có thể làm việc còn lại.

+3

trông giống như $ odate là không được đặt, có nghĩa là cuộc gọi đến DateTime được truyền null mà tôi nghi ngờ (nếu nó hoạt động ở tất cả) phải được xử lý làm mặc định 'hiện tại'. Bạn có thể kiểm tra cho DST sử dụng ngày ('I') và sau đó bù đắp bù trừ của bạn cho phù hợp. – Gavin

+0

Bạn đã thử bật tất cả cảnh báo trên máy chủ chưa? tức là 'error_reporting (-1); ini_set ('display_errors', 'On'); ' –

Trả lời

1

$ odate là null, mặc định là bây giờ cung cấp cho bạn khoản bù hiện tại. Những gì bạn muốn là bù đắp tại thời điểm mà lịch trình đang được thiết lập không phải là bù đắp ngay tại thời điểm này. Dường như ngày cơ sở dữ liệu của bạn nằm trong Mountain time và startdate của bạn là utc và bạn sẽ trừ bù đắp để quay lại núi (tôi nghĩ rằng bạn sẽ thêm số chênh lệch không trừ, vì vậy tôi có thể bị đảo ngược, bạn có thể truy vấn không Cơ sở dữ liệu của bạn và tìm ra nó?)

Trong mọi trường hợp, bạn nên tính toán khoản bù trừ bằng $ startdate không phải bây giờ(), thử chuyển $ startdate thành $ odate và xem điều gì xảy ra. Nếu điều này không hoạt động, hãy thử xây dựng một chuỗi từ startdate và sau đó tạo một ngày mới từ chuỗi đó. Nếu không có gì khác xuất chuỗi đó sẽ cung cấp cho bạn một hình ảnh rõ ràng về việc liệu $ startdate là UTC hoặc núi