Đối phó với máy chủ PHP và máy chủ MySQL ở các múi giờ khác nhau


11

Đối với những người dùng gói lưu trữ được chia sẻ chuẩn, chẳng hạn như GoDaddy hoặc Network Solutions, cách xử lý chuyển đổi datetime khi máy chủ lưu trữ (PHP) và máy chủ MySQL của bạn múi giờ khác nhau?

Ngoài ra, không ai có một số lời khuyên thực hành tốt nhất để xác định múi giờ nào mà khách truy cập vào trang web của bạn đang sử dụng và thao tác biến datetime một cách thích hợp?

17

Tính đến PHP 5.1.0 bạn có thể sử dụng chức năng date_default_timezone_set() để thiết lập múi giờ mặc định được sử dụng bởi tất cả các chức năng ngày/giờ trong một kịch bản.

Đối với MySql (trích dẫn từ MySQL Server Time Zone Support trang)

Trước MySQL 4.1.3, máy chủ hoạt động duy nhất trong múi giờ hệ thống thiết lúc khởi động. Bắt đầu với MySQL 4.1.3, máy chủ duy trì một số thiết lập múi giờ, một số có thể được sửa đổi trong thời gian chạy.

quan tâm đến bạn là mỗi kết nối thiết lập của các múi giờ, mà bạn sẽ sử dụng vào đầu script của bạn

SET timezone = 'Europe/London'; 

Đối với việc phát hiện các thiết lập client múi giờ, bạn có thể sử dụng một chút JavaScript để lấy và lưu thông tin đó vào một cookie và sử dụng nó trên trang tiếp theo để đọc, để tính múi giờ thích hợp.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes. 
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset); 

Hoặc bạn có thể cung cấp cho người dùng chioce để tự đặt múi giờ của mình.


11

Lưu trữ mọi thứ dưới dạng UTC. Bạn có thể thực hiện chuyển đổi ở cấp độ khách hàng hoặc ở phía máy chủ bằng cách sử dụng cài đặt ứng dụng khách.

php - date

mysql - utc-timestamp

  0

+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. 07 dec. 092009-12-07 20:55:13

  0

+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ị. 24 sep. 122012-09-24 08:48:17


0

Tôi lưu tất cả các ngày của mình dưới dạng bigint do đã gặp sự cố với loại ngày giờ trước đó. Tôi lưu kết quả của hàm time() PHP vào nó, bây giờ chúng được tính là trong cùng một múi giờ :)


3

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)


0

trong php bộ múi giờ bằng trong file php.ini: ini_set("date.timezone", "America/Los_Angeles");

?

hoặc trong trang cụ thể bạn có thể làm như sau: date_default_timezone_set("America/Los_Angeles");

Trong mysql bạn có thể làm như sau: SET GLOBAL time_zone = 'America/Los_Angeles';