2012-08-22 27 views
6

Bất cứ ai có thể giải thích tại sao mã sau đây DateTime->modify() mang lại kết quả mâu thuẫn lạ, tùy thuộc vào phiên bản PHP (có phải là lỗi không?)."DateTime-> sửa đổi ('+ 0 ngày')" Sửa đổi đối tượng DateTime

Tôi mong đợi tất cả các ví dụ để tạo ra cùng một ngày và thời gian các đối tượng được tạo ra, nhưng điều này rõ ràng không phải là trường hợp.

Ví dụ duy nhất có vẻ hoạt động là một ở giữa nơi đối tượng DateTime được tạo từ dấu thời gian UNIX và nơi đặt múi giờ sau đó (không thể đặt múi giờ khi xây dựng vì sẽ bị bỏ qua).

PHP 5.4.4 và 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 

Code:

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

Tôi có thể xác nhận hành vi này bằng cách sử dụng 'PHP 5.4.4' trên' Windows' (sử dụng múi giờ 'Châu Âu/Berlin') –

+0

Tôi xác nhận quá sử dụng PHP 5.3.8 trên Ubuntu, cùng một hành vi, thực sự nếu bạn' $ date -> sửa đổi ('+ 1 giờ'); 'nó sẽ xuất kết quả mong đợi. –

+1

Lưu ý: Sử dụng 'DateTime :: add()' và chỉ định 'DateInterval" P0D "' không thay đổi ngày tháng. Tôi nghĩ rằng đó là một lỗi trong PHP, xin hãy tử tế và báo cáo nó. –

Trả lời

2

Sử dụng DateTime::add() và chỉ định một thích hợp DateInterval "P0D" doesn' t thay đổi ngày. Tôi nghĩ rằng đó là một lỗi trong PHP, xin hãy tử tế và báo cáo nó.

Các vấn đề liên quan