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";
?>
Mogę potwierdzić to zachowanie za pomocą 'PHP 5.4.4' na' Windows' (używając strefy czasowej 'Europe/Berlin') –
Potwierdzam też używanie PHP 5.3.8 na Ubuntu, to samo zachowanie, faktycznie jeśli' $ date -> modify ('+ 1 hour'); 'wyświetli wynik oczekiwany. –
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. –