DateTime :: Diff debe calcular un intervalo adecuado y tener en cuenta el horario de verano (DST) y los años bisiestos. Aunque aparentemente no es así. Código de horror:DateTime de PHP :: ¿Diff se equivoca?
$d1 = new DateTime("2011-10-30 01:05:00", new DateTimeZone("Europe/Stockholm"));
$d2 = new DateTime("2011-10-30 03:05:00", new DateTimeZone("Europe/Stockholm"));
echo $d1->getOffset()/(60 * 60);
¡Imprime '2'! Tenga en cuenta que el tiempo UTC = 1h - 2h = 23:05:00 del día anterior.
echo $d2->getOffset()/(60 * 60);
Prints '1'. DST sucedió. Hora UTC = 3h - 1h = 02:05:00.
$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
Prints '2'! ¿Incorrecto?
$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp())/60/60;
echo "Calculated difference in hours: $hoursofdiff";
Prints '3'! ¿Correcto?
Cuando el reloj marcó 03:00:00 en la fecha indicada, todos los suecos volvieron su reloj una hora a 02:00:00. Eso significa que la cantidad total aprobada entre 01:05 y 03:05 es de tres horas, muy parecido al eco del cálculo manual cuando se usa el TimeStamp de UNIX. Y al igual que calculamos en nuestros dedos si usamos un reloj analógico. Aún más cuando calculamos la diferencia entre las dos marcas de tiempo UTC que obtuve utilizando la propia lógica de compensaciones de PHP (!).
¿Es PHP o mi cerebro dejó de funcionar correctamente? ¡Una reprimenda de cualquiera de ustedes, todos los dioses que existen en este sitio, me haría tan feliz!
Estoy usando PHP 5.4 (VC9) en un servidor Apache. Lamentablemente uso Windows 7 x64 como sistema operativo. He probado mi configuración contra todos los reclamos de errores en las clases de Fecha/Hora de PHP (hay un par relacionado con Windows) y puedo confirmar que mi sistema no tiene ninguno. Excepto por el código mencionado anteriormente, no he encontrado ningún otro error. Validé casi todo el código y saqué el libro "Guía de PHP Architect para la programación de fecha y hora" que tenía que ofrecer. Por lo tanto, debo concluir que tiene que ser mi cerebro el que ha incumplido, pero pensé que primero debería probarlo.
Igual en 5.3.6 en OS X y 5.3.9 en Ubuntu – Phil
también efectos 'DateTime :: sub()' y 'DateTime :: add() ' – Phil