2012-08-22 8 views
6

Czy ktokolwiek mógłby rozwinąć, dlaczego następujący kod DateTime->modify() daje te dziwne sprzeczne wyniki, w zależności od wersji PHP (czy jest to błąd? W jakiej wersji PHP?)."DateTime-> modify ('+ 0 days')" Modyfikuje obiekt DateTime

Spodziewam się, że wszystkie przykłady dadzą taką samą datę i godzinę utworzenia obiektów, ale najwyraźniej tak nie jest.

Jedynym przykładem, który wydaje się działać, jest ten w środku, w którym obiekt DateTime jest tworzony ze znacznika czasu UNIX i gdzie strefa czasowa jest ustawiona później (nie może być ustawiona podczas konstrukcji, ponieważ zostanie zignorowana).

PHP 5.4.4 i 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 

Kod:

<?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

Mogę potwierdzić to zachowanie za pomocą 'PHP 5.4.4' na' Windows' (używając strefy czasowej 'Europe/Berlin') –

+0

Potwierdzam też używanie PHP 5.3.8 na Ubuntu, to samo zachowanie, faktycznie jeśli' $ date -> modify ('+ 1 hour'); 'wyświetli wynik oczekiwany. –

+1

Uwaga: Użycie 'DateTime :: add()' i określenie odpowiedniego 'DateInterval" P0D "' nie zmienia daty. Myślę, że to błąd w PHP, proszę, bądź tak miły i zgłoś to. –

Odpowiedz

2

Korzystanie DateTime::add() i określając odpowiednią DateInterval "P0D" robi” t zmienić datę. Myślę, że to błąd w PHP, proszę, bądź tak miły i zgłoś to.

Powiązane problemy