Nếu bạn tự giới hạn mình trong các kiểu DATE và DATETIME của MySQL, bạn có thể bỏ qua phần lớn các vấn đề về múi giờ trong chính MySQL. Bạn muốn tránh loại TIMESTAMP của MySQL vì:
Đối với việc đọc / ghi các giá trị DATETIME, bạn sẽ nhận lại được chính xác những gì bạn đã đưa vào, điều này thật tốt.
Điều đó khiến bạn gặp vấn đề về việc luôn đảm bảo rằng bạn đang ghi các giá trị UTC vào cơ sở dữ liệu.
Cách tốt nhất để đảm bảo rằng PHP đang sử dụng UTC là đặt nó một cách rõ ràng trong ứng dụng của bạn bằng cách sử dụng date_default_timezone_set ()
. Điều đó sẽ đảm bảo rằng các cuộc gọi như date('Y-m-d H:i:s')
sẽ cung cấp cho bạn giá trị UTC. Nó cũng sẽ đảm bảo rằng một cái gì đó như (new \DateTime('now'))->getTimezone()
sẽ trả về một phiên bản UTC \ DateTimeZone.
Tất nhiên, bạn cần lưu ý rằng mọi thứ trở nên khó khăn hơn đáng kể khi bạn lưu trữ các giá trị ngày / giờ mà bạn lấy từ người dùng. Trong những trường hợp đó, bạn sẽ cần phải xác định bằng cách nào đó múi giờ của người dùng và xử lý chuyển đổi sang UTC trước khi duy trì các giá trị. Giả sử người dùng của bạn có một số cài đặt múi giờ cho mỗi người dùng, về cơ bản bạn làm điều gì đó như:
/** @var \DateTimeZone $userTZ */
$userTz = getUserTimezone();
$dateTime = new \DateTime($user_submitted_date_string, $userTz);
$dateTime->setTimezone(new \DateTime('UTC'));
$dateTimeStr = $dateTime->format('Y-m-d H:i:s');