2012-10-08 9 views
7

Estoy depurando un calendario de reserva de sala de conferencia que fue creado por alguien que ya no trabaja conmigo. Ha sido una pesadilla ya que había tantas cosas mal con eso, pero estoy teniendo problemas para averiguar exactamente qué está causando este último error. El calendario verifica si las habitaciones ya han sido reservadas en ciertos momentos y no están teniendo un problema como reservado en el momento adecuado, pero si alguien intenta reservar la misma habitación una hora o menos después de que la habitación se desocupe después de una cambiar hacia o desde el horario de verano, muestra la habitación como reservada aún. Ejemplo:La función en el código Estoy depurando parece no tener en cuenta los cambios hacia y desde DST

  • usuario ve que una habitación se reserva para 29 de noviembre de 09 a.m.-10 a.m..
  • El usuario intenta reservar la habitación el 29 de noviembre de 10:30 a.m. a 12:00 p.m.
  • El calendario cancela esta segunda solicitud e informa al usuario que la habitación ya está reservada.

Cabe señalar que esto no ocurre en ningún momento antes del cambio a DST (4 de noviembre). Aquí está la función que determina si la habitación está disponible:

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

Todos mis marcas de tiempo hasta este punto están en UTC y noto la variable $odate es en realidad nunca se crea una instancia en cualquier lugar, pero no he sido capaz de determinar qué valor para pasarlo para que la compensación funcione correctamente. Si puedo averiguar qué tipo de fecha quiere, debería poder resolver el resto.

+3

Me parece $ Odate no está definido lo que significa la llamada a DateTime se pasa nula que sospecho (si funciona en absoluto) debe ser procesado como el predeterminado 'ahora'. Puede probar el horario de verano usando la fecha ('I') y luego compensar sus desplazamientos en consecuencia. – Gavin

+0

¿Ha intentado habilitar todas las advertencias en su servidor? es decir 'error_reporting (-1); ini_set ('display_errors', 'On'); ' –

Respuesta

1

$ odate es nulo, que por defecto ahora le da la compensación actual. Lo que desea es el desplazamiento en el momento en que se establece el cronograma, no el desplazamiento en este momento. Parece que las fechas de su base de datos están en el tiempo de la montaña y que su startdate es UTC y está restando el desplazamiento para volver a la montaña (Me gustaría pensar que deberá añadir las compensaciones no restan, por lo que podría tener esta invertida, se puede consultar su base de datos y averiguarlo?)

En cualquier caso, usted debe calcular su desplazamiento utilizando $ startdate no ahora(), trate de cambiar $ startdate por $ Odate y ver lo que sucede. Si esto no funciona, intente construir una cadena a partir de la fecha de inicio y luego genere una nueva fecha a partir de esa cadena. Si nada más la salida de esa cadena debe darle una idea clara acerca de si $ startdate es UTC o de montaña

Cuestiones relacionadas