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à dành riêng cho khách hàng có thể được truy xuất như sau:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Chỉnh sửa Trả về ở trên SYSTEM
nếu MySQL được đặt thành nô lệ theo 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
, thì bạn có thể hỏi hệ thống sử dụng múi giờ nào thô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 giả định, giả sử máy chủ web và máy chủ DB mà nó đang nói đến được đặt thành [nếu không thực sự ở ] cùng một múi giờ bước nhảy vọt lớn .) Nhưng hãy cẩn thận (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 cáo một 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ề việc múi giờ mà máy chủ MySQL đang sử dụng có thể là một tiếp tuyến, bởi vì việc hỏi máy chủ đó là múi giờ nào cho bạn biết hoàn toàn không có gì về dữ liệu trong cơ sở dữ liệu. Đọc để 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à 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, do đó, mọi hoạt động tiếp theo (như now()
) sẽ sử dụng GMT.
Tuy nhiên, xin lưu ý rằng các giá trị thời gian và ngày không đượ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, biết múi giờ của máy chủ là chỉ quan trọng về chức năng mà có được thời gian ngay bây giờ, chẳng hạn như now()
, unix_timestamp()
, vv .; nó không cho bạn biết bất cứ điều gì về múi giờ trong dữ liệu cơ sở dữ liệu đang sử dụng. Bạn có thể chọn giả sử chúng được viết bằng múi giờ của máy chủ, nhưng giả định đó có thể là thiếu sót. Để biết múi giờ của bất kỳ ngày hoặc thời gian 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 luôn trong GMT.
Tại sao giả sử dữ liệu được ghi bằng múi giờ của máy chủ bị sai sót? Chà, đố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 chuyển từ máy chủ này sang máy chủ khác, trong đó các máy chủ ở các múi giờ khác nhau (tôi đã gặp phải điều đó khi tôi thừa hưởng cơ sở dữ liệu đã được 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, nó vẫ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 vào lúc 2:00 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ó? Đó có phải là 1:30 sáng ngày 1 tháng 11 PDT hay 1:30 sáng ngày 1 tháng 11 PST (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ờ trong GMT (không thực hiện DST) và chuyển đổi sang múi giờ mong muốn như / khi cần thiết.