3 回答

TA貢獻(xiàn)2019條經(jīng)驗 獲得超9個贊
從手冊(第9.6節(jié)):
可以像下面這樣檢索全局和客戶端特定時區(qū)的當(dāng)前值:
mysql> SELECT @@global.time_zone, @@session.time_zone;
編輯SYSTEM
如果將MySQL設(shè)置為系統(tǒng)時區(qū)的slave,則上面返回,這不太有用。由于您使用的是PHP,如果MySQL的答案是SYSTEM
,您可以詢問系統(tǒng)它使用的時區(qū)date_default_timezone_get
。(當(dāng)然,正如VolkerK所指出的那樣,PHP可能在不同的服務(wù)器上運(yùn)行,但是假設(shè),假設(shè)它正在與之交談的Web服務(wù)器和數(shù)據(jù)庫服務(wù)器設(shè)置為 [如果不是實際存在 ]同一時區(qū)不是巨大的飛躍。)但要注意(與MySQL一樣),您可以設(shè)置PHP使用的時區(qū)(date_default_timezone_set
),這意味著它可能報告與操作系統(tǒng)使用的值不同的值。如果您掌握了PHP代碼,那么您應(yīng)該知道自己是否這樣做并且沒問題。
但是MySQL服務(wù)器正在使用的時區(qū)的整個問題可能是切線,因為詢問服務(wù)器它所在的時區(qū)對數(shù)據(jù)庫中的數(shù)據(jù)一無所知。繼續(xù)閱讀詳情:
進(jìn)一步討論:
如果您控制服務(wù)器,當(dāng)然可以確保時區(qū)是已知數(shù)量。如果您無法控制服務(wù)器,可以設(shè)置連接使用的時區(qū),如下所示:
set time_zone = '+00:00';
這將時區(qū)設(shè)置為GMT,以便任何進(jìn)一步的操作(如now()
)將使用GMT。
但請注意,時間和日期值不會與MySQL中的時區(qū)信息一起存儲:
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)
因此,了解服務(wù)器的時區(qū)是在該得到的時間,現(xiàn)在的功能,如條款唯一重要的now()
,unix_timestamp()
等等; 它沒有告訴您有關(guān)數(shù)據(jù)庫數(shù)據(jù)中的日期使用的時區(qū)的任何信息。您可以選擇假設(shè)它們是使用服務(wù)器的時區(qū)編寫的,但這種假設(shè)可能存在缺陷。要知道存儲在數(shù)據(jù)中的任何日期或時間的時區(qū),您必須確保它們與時區(qū)信息一起存儲或(如我所知)確保它們始終處于GMT狀態(tài)。
為什么假設(shè)數(shù)據(jù)是使用服務(wù)器的時區(qū)寫的?嗯,首先,數(shù)據(jù)可能是使用設(shè)置不同時區(qū)的連接編寫的。數(shù)據(jù)庫可能已從一個服務(wù)器移動到另一個服務(wù)器,其中服務(wù)器位于不同的時區(qū)(當(dāng)我繼承了從德克薩斯州搬到加利福尼亞州的數(shù)據(jù)庫時,我遇到了這個問題)。但即使數(shù)據(jù)寫在服務(wù)器上,當(dāng)前的時區(qū)也是如此,它仍然是模棱兩可的。去年,在美國,夏令時于11月1日凌晨2點被關(guān)閉。假設(shè)我的服務(wù)器使用太平洋時區(qū)在加利福尼亞,我有值2009-11-01 01:30:00
在數(shù)據(jù)庫中。那是什么時候?這是太平洋標(biāo)準(zhǔn)時間11月1日凌晨1:30,或太平洋標(biāo)準(zhǔn)時間11月1日凌晨1:30(一小時后)?你完全沒辦法知道。道德:始終將日期/時間存儲在GMT(不執(zhí)行DST)并在必要時轉(zhuǎn)換為所需的時區(qū)。

TA貢獻(xiàn)1995條經(jīng)驗 獲得超2個贊
只是 SELECT @@system_time_zone;
返回PST
(或與您的系統(tǒng)相關(guān)的任何內(nèi)容)。
如果您要確定會話時區(qū),可以使用此查詢:SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
如果會話時區(qū)與系統(tǒng)時區(qū)不同,則返回會話時區(qū)。
添加回答
舉報