代码中的函数我正在调试似乎没有考虑到DST的转换

时间:2012-10-08 21:40:29

标签: php mysql calendar dst

我正在调试一个会议室预订日历,由不再与我合作的人组成。这是一场噩梦,因为它有太多的错误,但是我无法弄清楚到底是什么导致了这个最后的错误。日历检查房间是否已经在某些时间被预订,并且他们没有在正确的时间显示预订的问题,但是如果有人试图在房间空出后一小时或更短时间内预订同一房间转入或转出夏令时,它显示房间仍然是预定的。 例如:

  • 用户认为11月29日上午9点至10点将保留一个房间。
  • 用户然后尝试在11月29日上午10:30至晚上12:00预订房间。
  • 日历会取消此第二个请求,并通知用户该房间已被预订。

应该注意的是,这不会在转移到夏令时(11月4日)之前的任何时间发生。这是确定房间是否可用的功能:

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

到目前为止,我所有的时间戳都是UTC,我注意到$odate变量实际上从未在任何地方实例化,但我无法确定传递它的值是什么,以便抵消工作正常。如果我能找到它想要的日期,我应该能够完成其余的工作。

1 个答案:

答案 0 :(得分:1)

$ odate为null,默认为现在为您提供当前偏移量。你想要的是在设定时间表时的偏移量,而不是此刻的偏移量。看起来您的数据库日期是在山区时间,并且您的开始日期是utc并且您正在减去偏移量以返回到山区(我认为您将添加偏移量而不是减去,所以我可能会将此反转,您可以查询你的数据库并弄清楚了吗?)

无论如何你应该使用$ startdate not now()来计算你的偏移量,尝试为$ odate切换$ startdate并看看会发生什么。如果这不起作用,请尝试从startdate构建一个字符串,然后从该字符串生成一个新日期。如果输出该字符串没有其他任何内容可以让您清楚地了解$ startdate是UTC还是山峰