Từ hướng dẫn ( phần 9.6 ):
Các giá trị hiện tại của múi giờ toàn cầu và múi giờ dành riêng cho máy khách có thể được truy xuất như sau:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Chỉnh sửa Ở trên trả về SYSTEM
nếu MySQL được đặt để sử dụng múi giờ của hệ thống, điều này ít hữu ích hơn. Vì bạn đang sử dụng PHP, nếu câu trả lời từ MySQL là SYSTEM
, sau đó bạn có thể hỏi hệ thống đó là múi giờ nào sử dụng qua date_default_timezone_get
. (Tất nhiên, như VolkerK đã chỉ ra, PHP có thể đang chạy trên một máy chủ khác, nhưng theo các giả định, giả sử máy chủ web và máy chủ DB mà nó đang nói chuyện được đặt thành [nếu không thực sự trong ] cùng một múi giờ không phải là rất lớn nhảy vọt.) Nhưng hãy lưu ý rằng (như với MySQL), bạn có thể đặt múi giờ mà PHP sử dụng ( date_default_timezone_set
), có nghĩa là nó có thể báo giá trị khác với hệ điều hành đang sử dụng. Nếu bạn đang kiểm soát mã PHP, bạn nên biết liệu bạn đang làm điều đó và có ổn không.
Nhưng toàn bộ câu hỏi về múi giờ mà máy chủ MySQL đang sử dụng có thể là một phần tiếp theo, bởi vì việc hỏi máy chủ múi giờ nào sẽ cho bạn biết hoàn toàn không có gì về dữ liệu trong cơ sở dữ liệu. Đọc tiếp để biết chi tiết:
Thảo luận thêm :
Nếu bạn đang kiểm soát máy chủ, tất nhiên bạn có thể đảm bảo rằng múi giờ là một số lượng đã biết. Nếu bạn không kiểm soát máy chủ, bạn có thể đặt múi giờ được sử dụng bởi kết nối của bạn như thế này:
set time_zone = '+00:00';
Điều đó đặt múi giờ thành GMT để có thêm bất kỳ hoạt động nào (như now()
) sẽ sử dụng GMT.
Tuy nhiên, xin lưu ý rằng các giá trị ngày và giờ không phải được lưu trữ với thông tin múi giờ trong MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Vì vậy, việc biết múi giờ của máy chủ chỉ quan trọng đối với các chức năng lấy thời gian ngay bây giờ, chẳng hạn như now()
, unix_timestamp()
, vân vân.; nó không cho bạn biết bất cứ điều gì về múi giờ mà các ngày trong cơ sở dữ liệu đang sử dụng. Bạn có thể chọn giả định chúng được viết bằng múi giờ của máy chủ, nhưng giả định đó có thể là sai sót. Để biết múi giờ của bất kỳ ngày hoặc giờ nào được lưu trữ trong dữ liệu, bạn phải đảm bảo rằng chúng được lưu trữ với thông tin múi giờ hoặc (như tôi làm) đảm bảo chúng luôn ở GMT.
Tại sao giả sử dữ liệu được ghi bằng múi giờ của máy chủ lại bị sai sót? Vâng, đối với một điều, dữ liệu có thể đã được ghi bằng cách sử dụng một kết nối đặt múi giờ khác. Cơ sở dữ liệu có thể đã được di chuyển từ máy chủ này sang máy chủ khác, nơi các máy chủ ở các múi giờ khác nhau (tôi đã gặp phải điều đó khi tôi kế thừa một cơ sở dữ liệu đã chuyển từ Texas đến California). Nhưng ngay cả khi dữ liệu được ghi trên máy chủ, với múi giờ hiện tại của nó, nó vẫn còn mơ hồ. Năm ngoái, tại Hoa Kỳ, Giờ tiết kiệm ánh sáng ban ngày đã bị tắt lúc 2 giờ sáng ngày 1 tháng 11. Giả sử máy chủ của tôi ở California sử dụng múi giờ Thái Bình Dương và tôi có giá trị 2009-11-01 01:30:00
trong cơ sở dữ liệu. Khi là nó? Đó là 1:30 sáng ngày 1 tháng 11 theo giờ PDT hay 1 giờ 30 sáng theo giờ PST ngày 1 tháng 11 (một giờ sau)? Bạn hoàn toàn không có cách nào để biết. Đạo đức:Luôn lưu trữ ngày / giờ theo GMT (không tính theo DST) và chuyển đổi sang múi giờ mong muốn khi cần thiết.