DateTime :: Diff cần tính toán một khoảng thời gian thích hợp và tính đến thời gian tiết kiệm ánh sáng ban ngày (DST) và năm nhuận. Mặc dù rõ ràng nó không phải như vậy. Mã kinh dị:DateTime của PHP :: Diff hiểu sai?
$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);
In '2'! Hãy nhớ rằng thời gian UTC = 1h - 2h = 23:05:00 ngày hôm trước.
echo $d2->getOffset()/(60 * 60);
In '1'. DST đã xảy ra. Thời gian UTC = 3h - 1h = 02:05:00.
$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
In '2'! Sai rồi?
$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp())/60/60;
echo "Calculated difference in hours: $hoursofdiff";
In '3'! Chính xác?
Khi đồng hồ quay 03:00:00 tại ngày đã cho, tất cả người Thụy Điển đã quay đồng hồ của họ sau một giờ đến 02:00:00. Điều đó có nghĩa là tổng số tiền được chuyển từ 01:05 đến 03:05 là ba giờ, giống như việc tính toán thủ công được lặp lại khi sử dụng UNIX TimeStamp. Và giống như chúng ta tính toán trên ngón tay của mình nếu chúng ta sử dụng đồng hồ tương tự. Thậm chí nhiều hơn như vậy khi chúng tôi tính toán sự khác biệt giữa hai dấu thời gian UTC tôi đã sử dụng logic riêng của PHP của các offset (!).
Có phải PHP hoặc bộ não của tôi đã ngừng hoạt động đúng không? Một sự khiển trách từ bất cứ ai trong các bạn, tất cả các vị thần tồn tại trên trang web này sẽ làm tôi rất hạnh phúc!
Tôi đang sử dụng PHP 5.4 (VC9) trên máy chủ Apache. Thật không may, tôi sử dụng Windows 7 x64 làm hệ điều hành. Tôi đã thử nghiệm thiết lập của tôi chống lại tất cả các tuyên bố lỗi trong các lớp Date/Time của PHP (có một vài liên quan đến Windows) và có thể xác nhận rằng hệ thống của tôi không có chúng. Ngoại trừ đoạn mã trên tôi đã không tìm thấy bất kỳ lỗi nào khác. Tôi đã kiểm tra khá nhiều mã và xuất ra cuốn sách "Hướng dẫn của Kiến trúc sư PHP về lập trình ngày tháng và thời gian" đã cung cấp. Vì vậy, tôi phải kết luận nó phải là phù thủy não của tôi đã mặc định nhưng tôi nghĩ rằng tôi muốn cho nó một shoot ở đây đầu tiên.
Cùng trên 5.3.6 trên OS X và 5.3.9 trên Ubuntu – Phil
Ngoài ra hiệu ứng 'DateTime :: sub() 'và' DateTime :: add() ' – Phil