2011-12-03 38 views
7

PHP date() & time() trở lại thời gian không chính xác:PHP sai ngày/giờ

Khi date.timezone = "Europe/Riga" thời gian trả về bởi date()03-12-2011 08:57:12, nhưng thời gian hệ thống đã 03-12-2011 01:57:12 (múi giờ Châu Âu/Riga - đúng thời gian tại thời điểm đó). Khi tôi đã thay đổi múi giờ để "Châu Âu/London", thời gian thay đổi để 03-12-2011 06:57:12 (thực tế thời gian 02-12-2011 23:57:12)

Thời gian trả về bởi date/hwclock --show là đúng (03-12-2011 01:57:12 với hệ thống múi giờ thiết lập như Riga)

Hệ điều hành: Debian 6.0

Tôi đã kiểm tra hầu hết các câu hỏi liên quan đến các sự cố tương tự trên SO/Google, nhưng tất cả các câu hỏi này dường như đã chỉ định múi giờ sai.

Theo như tôi có thể biết có vấn đề giữa php -> os. Tất nhiên, bởi vì thời gian bù sai không chính xác luôn luôn là hằng số tôi có thể trừ sự khác biệt, nhưng nó không phải là một giải pháp thích hợp.

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

+1

Bạn đang sử dụng gì cho giá trị 'date()'? ví dụ. 'date ('Ymd H: i: s')' –

+1

Có - 'ngày ('Ymd H: i: s')' – relic

+0

Điều gì xảy ra nếu bạn sử dụng lớp 'DateTime' để xác định ngày, kết hợp với' DateTimeZone' ? Ví dụ '$ d = new DateTime ('', new DateTimeZone ('Europe/Riga')); echo $ d-> format ('Y-m-d H: i: s'); ' –

Trả lời

3

Sự cố có vẻ giống với những gì tôi đã thấy trên một trong các máy chủ của tôi. Trông giống như bug in php 5.3.2-1. Hãy thử chạy tập lệnh php trong báo cáo lỗi và đăng kết quả của bạn.

+1

Dường như đó không phải là lỗi thực sự. Các phóng viên chỉ đơn giản là có mã khác đã được đặt lại múi giờ mặc định. Vì vậy, hợp lệ trong ý nghĩa rằng bạn nên xem cho điều đó. Beaware mã và cài đặt .ini có thể có tác động. – ficuscr

10

Đọc hướng dẫn sử dụng PHP có vẻ như hành vi của date.timezone bị ảnh hưởng bởi cài đặt trong php.ini. Có một cách khác để đặt múi giờ mặc định trong tất cả chức năng ngày/giờ và là date_default_timezone_set. Cố gắng thiết lập nó với:

date_default_timezone_set('Europe/Riga'); 

thay vì date.timezone mã của bạn.

+0

Cảm ơn. Nhưng tôi đã thử nó mà không thành công. Thực tế là khi tôi thay đổi múi giờ từ Riga sang London, chênh lệch thời gian là 2 giờ cho thấy lựa chọn múi giờ "hoạt động", nhưng vấn đề là với giá trị thời gian ban đầu. – relic

2

Múi giờ của hệ thống có thể sai. Điều này dẫn đến một sự thay đổi trong một thời gian được đưa ra bởi hàm PHP date(), mặc dù cả hai date.timezone php (trong php.ini) và thời gian hệ thống của máy chủ là chính xác.

-4

Thời gian PHP dựa trên thang thời gian thời gian sử dụng GMT và sau đó là UTC. Hầu hết mọi người bây giờ gọi nó là thời gian unix. Bởi vì PHP sử dụng thời gian unix, múi giờ không được sử dụng. Tôi tin rằng trừ đi các múi giờ trong vài giây là phương pháp chính xác để điều chỉnh sự khác biệt.

+0

Thời gian Unix là một số đếm đơn giản từ một thời điểm cố định - nó hoàn toàn không bị ảnh hưởng bởi các múi giờ. Ngoài ra, PHP có xử lý múi giờ khá tốt; hoàn toàn không có lý do để bỏ qua nó và viết của riêng bạn. –

-2

Bạn phải thiết lập date.timezone trong php.ini và khởi động lại máy chủ của bạn http://php.net/manual/en/timezones.php

+0

Đây chính xác là ý nghĩa của OP khi anh ta nói 'date.timezone =" Europe/Riga "'. –

1

tôi đã có một số vấn đề với múi giờ quá. Điều này có thể thuận tiện cho ai đó.

Trong trường hợp của tôi, Chile Sumer Time CLST trả lại sai lệch múi giờ sai.

Cập nhật timezonedb làm việc cho tôi.

Go to: https://pecl.php.net/package/timezonedb

Đối với Widnows Tải về phiên bản mới nhất của dll, sao chép vào thư mục "ext". Chỉnh sửa php.ini và đặt bên dưới dòng:

extension = php_timezonedb.dll

Đối với Linux Bạn có thể sử dụng:

pecl install timezonedb

và đặt php.ini:

mở rộng = php_timezonedb.so

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