Trả lời từ Željko Živković, các bộ mô tả múi giờ như 'Europe/London' chỉ hoạt động nếu quản trị mySQL đã thêm các bảng múi giờ vào hệ thống và giữ chúng được cập nhật.
Nếu không, bạn được giới hạn số lần bù bằng số như '-4: 00'. May mắn thay ngày php ('P') định dạng cung cấp nó (tính đến 5.1.3)
Vì vậy, trong tiếng nói một tập tin ứng dụng cấu hình bạn có thể có
define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
date_default_timezone_set(TZ);
$mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}
Điều này có nghĩa PHP và mySQL sẽ đồng ý về những gì múi giờ bù đắp để sử dụng.
Luôn sử dụng TIMESTAMP để lưu trữ giá trị thời gian. Cột này thực sự được lưu trữ dưới dạng UNIX_TIME (epoch) nhưng được chuyển đổi hoàn toàn từ bù đắp time_zone hiện tại khi được viết và ngược lại khi đọc.
Nếu bạn muốn hiển thị thời gian cho người dùng trong các múi giờ khác, sau đó thay vì định nghĩa toàn cục(), hãy đặt múi giờ đã cho ở trên.Giá trị TIMESTAMP sẽ được mySQL chuyển đổi tự động vào thời điểm ứng dụng của bạn thấy tập hợp kết quả (đôi khi có thể là vấn đề, nếu bạn thực sự cần biết múi giờ ban đầu của sự kiện thì cần phải nằm trong cột khác)
và như xa, "tại sao không chỉ lưu trữ tất cả các lần như int", mà mất bạn khả năng so sánh và xác nhận ngày, và có nghĩa là bạn luôn luôn phải chuyển đổi để đại diện ngày ở cấp ứng dụng (và là khó khăn về mắt khi bạn đang xem xét các dữ liệu trực tiếp - nhanh chóng, những gì xảy ra tại 1254369600)
+1 tôi nhận được cái nhìn gian xảo mắt nhưng tôi luôn lưu trữ unix thời gian/thời đại như một ký int (muốn ký cho toán ngày). Không bao giờ có bất kỳ sự nhầm lẫn và tồn tại TZ chính phủ thay đổi. – Xailor
+1, giữ cho mọi thứ đơn giản và chuẩn hóa (= trong UTC) ở cấp dữ liệu khiến cho khó có được logic sai. Mọi chuyển đổi theo vị trí cụ thể chỉ nên được thực hiện ở cấp độ hiển thị. – Kos