亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取MySQL的當前時區?

如何獲取MySQL的當前時區?

慕斯王 2019-07-25 19:48:14
如何獲取MySQL的當前時區?誰知道MySQL中是否有這樣的功能?UPDATE這不會輸出任何有效信息:mysql> SELECT @@global.time_zone, @@session.time_zone;+--------------------+---------------------+| @@global.time_zone | @@session.time_zone |+--------------------+---------------------+| SYSTEM             | SYSTEM              |+--------------------+---------------------+或者也許MySQL本身無法準確知道所time_zone使用的,那很好,我們可以參與PHP這里,只要我能得到有效的信息不喜歡SYSTEM......
查看完整描述

3 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

從手冊(第9.6節):

可以像下面這樣檢索全局和客戶端特定時區的當前值: 
mysql> SELECT @@global.time_zone, @@session.time_zone;

編輯SYSTEM如果將MySQL設置為系統時區的slave,則上面返回,這不太有用。由于您使用的是PHP,如果MySQL的答案是SYSTEM,您可以詢問系統使用的時區date_default_timezone_get。(當然,正如VolkerK所指出的那樣,PHP可能在不同的服務器上運行,但是假設,假設它正在與之交談的Web服務器和數據庫服務器設置為 [如果不是實際存在 ]同一時區不是巨大的飛躍。)但要注意(與MySQL一樣),您可以設置PHP使用的時區(date_default_timezone_set),這意味著它可能報告與操作系統使用的值不同的值。如果您掌握了PHP代碼,那么您應該知道自己是否這樣做并且沒問題。

但是MySQL服務器正在使用的時區的整個問題可能是切線,因為詢問服務器它所在的時區對數據庫中的數據一無所知。繼續閱讀詳情:

進一步討論

如果您控制服務器,當然可以確保時區是已知數量。如果您無法控制服務器,可以設置連接使用的時區,如下所示:

set time_zone = '+00:00';

這將時區設置為GMT,以便任何進一步的操作(如now())將使用GMT。

但請注意,時間和日期值不會與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)

因此,了解服務器的時區是在該得到的時間,現在的功能,如條款唯一重要的now(),unix_timestamp()等等; 它沒有告訴您有關數據庫數據中的日期使用的時區的任何信息。您可以選擇假設它們是使用服務器的時區編寫的,但這種假設可能存在缺陷。要知道存儲在數據中的任何日期或時間的時區,您必須確保它們與時區信息一起存儲或(如我所知)確保它們始終處于GMT狀態。

為什么假設數據是使用服務器的時區寫的?嗯,首先,數據可能是使用設置不同時區的連接編寫的。數據庫可能已從一個服務器移動到另一個服務器,其中服務器位于不同的時區(當我繼承了從德克薩斯州搬到加利福尼亞州的數據庫時,我遇到了這個問題)。但即使數據寫在服務器上,當前的時區也是如此,它仍然是模棱兩可的。去年,在美國,夏令時于11月1日凌晨2點被關閉。假設我的服務器使用太平洋時區在加利福尼亞,我有值2009-11-01 01:30:00在數據庫中。那是什么時候?這是太平洋標準時間11月1日凌晨1:30,或太平洋標準時間11月1日凌晨1:30(一小時后)?你完全沒辦法知道。道德:始終將日期/時間存儲在GMT(不執行DST)并在必要時轉換為所需的時區。


查看完整回答
反對 回復 2019-07-25
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

只是 SELECT @@system_time_zone;

返回PST(或與您的系統相關的任何內容)。

如果您要確定會話時區,可以使用此查詢:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

如果會話時區與系統時區不同,則返回會話時區。


查看完整回答
反對 回復 2019-07-25
  • 3 回答
  • 0 關注
  • 1174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號