Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng múi giờ trong ứng dụng web PHP

Tôi đã xử lý tình huống này một cách sâu rộng trong một ứng dụng PHP / MySQL mà tôi đã viết cho một nhà điều hành máy bay tư nhân hơn một năm trước. Có các chiến lược khác nhau để xử lý múi giờ trong hai nền tảng này, nhưng tôi sẽ giải thích cách tôi đã làm điều đó. Tôi đặt máy chủ MySQL thành UTC và chạy từng tập lệnh PHP trong múi giờ mà người dùng chỉ định trong quá trình đăng ký hồ sơ người dùng.

MySQL và PHP (PHP 5.2 trở lên) đều có kiểu dữ liệu datetime gốc. Ngày giờ của MySQL là kiểu dữ liệu nguyên thủy, trong khi PHP 5.2 trở lên cung cấp tích hợp sẵn Lớp DateTime . Kiểu dữ liệu datetime của MySQL không bao gồm siêu dữ liệu cho múi giờ, nhưng một đối tượng DateTime PHP luôn bao gồm một múi giờ. Nếu hàm tạo datetime PHP không chỉ định múi giờ tùy chọn trong đối số thứ hai, thì hàm tạo datetime PHP sử dụng biến môi trường php.

Cả MySQL và PHP đều có múi giờ mặc định được đặt trong tệp cấu hình. MySQL sử dụng đặt datetime trong tệp cấu hình cho mỗi kết nối db trừ khi người dùng chỉ định múi giờ khác sau khi kết nối được bắt đầu bằng lệnh SET time_zone = [timezone]; . PHP cũng đặt một biến môi trường múi giờ cho mỗi tập lệnh bằng cách sử dụng múi giờ đã đặt trong tệp cấu hình máy chủ và biến môi trường này có thể được ghi đè bằng cách sử dụng hàm PHP date_default_timezone_set() sau khi tập lệnh bắt đầu.

Lớp DateTime trong PHP có thuộc tính gọi là múi giờ , là một đối tượng PHP DateTimeZone . Đối tượng DateTimeZone được chỉ định bằng cách sử dụng một chuỗi cho múi giờ chính xác. danh sách múi giờ là toàn diện, có hàng trăm múi giờ riêng lẻ trên khắp thế giới. Múi giờ PHP sẽ tự động tính đến thời gian tiết kiệm ánh sáng ban ngày.

Khi người dùng tạo ngày giờ trong ứng dụng web, hãy tạo một đối tượng ngày giờ PHP trong múi giờ của hồ sơ người dùng. Sau đó, sử dụng setTimezone để sửa đổi đối tượng DateTime thành múi giờ UTC. Bây giờ bạn có ngày giờ của người dùng theo giờ UTC và bạn có thể lưu trữ giá trị trong cơ sở dữ liệu. Sử dụng định dạng DateTime format để thể hiện dữ liệu dưới dạng chuỗi ở định dạng được MySQL chấp nhận.

Vì vậy, người dùng tạo datetime và bạn tạo một đối tượng datetime PHP trong múi giờ được chỉ định của người dùng:

// set using an include file for user profile
$user_timezone = new DateTimeZone('America/New_York'); 

// 1st arg in format accepted by PHP strtotime
$date_object1 = new DateTime('8/9/2012 5:19 PM', $user_timezone); 
$date_object1->setTimezone(new DateTimeZone('UTC'));
$formated_string = $date_object1->format('Y-m-d H:i:s');
$query_string = "INSERT INTO `t_table1` (`datetime1`) VALUES('$formated_string')";

Khi bạn truy xuất giá trị từ cơ sở dữ liệu, hãy xây dựng trong UTC và sau đó chuyển đổi sang múi giờ của người dùng.

$query_string = "SELECT `datetime1` FROM `t_table1`";
$date_object1 = new DateTime($datetime_string_from_mysql, new DateTimeZone('UTC'));
$date_object1->setTimezone($user_timezone);
$string_for_display_in_application = $date_object1->format('m/d/Y g:i a');

Sử dụng phương pháp này, các giá trị ngày giờ của bạn luôn được lưu trữ theo giờ UTC bên trong db và người dùng luôn trải nghiệm các giá trị trong múi giờ của hồ sơ của họ. PHP sẽ sửa cho Giờ tiết kiệm ánh sáng ban ngày nếu cần thiết cho từng múi giờ.

Một gotcha:Giải thích này không bao gồm loại dữ liệu dấu thời gian MySQL. Tôi khuyên bạn nên sử dụng kiểu dữ liệu datetime của MySQL để lưu trữ các giá trị datetime, không phải kiểu dữ liệu dấu thời gian. Loại dữ liệu dấu thời gian được đề cập trong hướng dẫn tại đây .

Chỉnh sửa: Bạn có thể tạo một mảng chứa mọi chuỗi múi giờ PHP bằng cách sử dụng listIdentifier , là một phương thức tĩnh của lớp DateTimeZone.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lấy tất cả các con theo id cha và mệnh đề where trong mysql

  2. Cách chạy tập lệnh PHP vào thời gian đã lên lịch

  3. Lược đồ cơ sở dữ liệu cho trò chuyện:riêng tư và nhóm

  4. Để lập kế hoạch cho dự án MySQL đầu tiên của tôi

  5. Làm thế nào để triển khai hệ thống gắn thẻ tương tự như SO trong php / mysql?