2012-08-22 26 views
6

¿Podría alguien explicar por qué el siguiente código DateTime->modify() produce esos extraños resultados contradictorios, dependiendo de la versión de PHP (¿es un error? ¿En qué versión de PHP?)"DateTime-> modify ('+ 0 days')" Modifica el objeto DateTime

Yo esperaría que todos los ejemplos para producir la misma fecha y hora los objetos fueron creados con, pero esto no parece ser el caso.

El único ejemplo que parece funcionar es el que está en el medio donde se crea el objeto DateTime a partir de una marca de tiempo UNIX y donde la zona horaria se establece posteriormente (no se puede establecer en la construcción porque se ignorará).

PHP 5.4.4 y 5.4.6:

FROM TIMESTAMP, NO TZ: 
2012-08-21 22:00:00 GMT+0000 (offset 0) <-- different 
2012-08-21 23:00:00 GMT+0000 (offset 0) <-- from this 
FROM TIMESTAMP, WITH TZ: 
2012-08-22 00:00:00 CEST (offset 7200) 
2012-08-22 00:00:00 CEST (offset 7200) 
FROM STRING: 
2012-08-22 00:00:00 CEST (offset 7200) 
2012-08-22 00:00:00 CEST (offset 7200) 

PHP 5.2.0:

FROM TIMESTAMP, NO TZ: 
2012-08-21 22:00:00 GMT+0100 (offset 7200) 
2012-08-21 22:00:00 GMT+0100 (offset 7200) 
FROM TIMESTAMP, WITH TZ: 
2012-08-22 00:00:00 CEST (offset 7200) 
2012-08-22 00:00:00 CEST (offset 7200) 
FROM STRING: 
2012-08-22 00:00:00 CEST (offset 7200) <-- different 
2012-08-21 23:00:00 CEST (offset 7200) <-- from this 

Código:

<?php 
    $tz = new DateTimeZone('Europe/Berlin'); 

    echo "FROM TIMESTAMP, NO TZ:\n"; 

    $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST')); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    $date->modify('+0 days'); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    echo "FROM TIMESTAMP, WITH TZ:\n"; 

    $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST')); 
    $date->setTimezone($tz); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    $date->modify('+0 days'); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    echo "FROM STRING:\n"; 

    $date = new DateTime('2012-08-22 00:00:00 CEST', $tz); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    $date->modify('+0 days'); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 
?> 
+0

Puedo confirmar este comportamiento usando 'PHP 5.4.4' en' Windows' (usando una zona horaria 'Europa/Berlín') –

+0

Lo confirmo usando PHP 5.3.8 en Ubuntu, el mismo comportamiento, en realidad si' 'date -> modify ('+ 1 hour'); 'arrojará el resultado esperado. –

+1

Nota: El uso de 'DateTime :: add()' y la especificación de un 'DateInterval" P0D "' no cambia la fecha. Creo que es un error en PHP, por favor sé tan amable e infórmalo. –

Respuesta

2

Uso de DateTime::add() y especificando una apropiada DateInterval "P0D" doesn' t cambiar la fecha. Creo que es un error en PHP, por favor sé tan amable e infórmalo.