1. 程式人生 > >關於資料庫與伺服器時區的問題

關於資料庫與伺服器時區的問題

一、概述

  最近在做MySql生日提交的時候,通過URL訪問資料庫得到的資料總是比資料庫中儲存的資料少一天。查閱資料找到以下解決方法,用以記錄備忘。

二、修改MySql資料庫的預設時區

  MySql資料庫建立後,預設的時區比東八區少了八個小時。如果Sql語句中使用到MySql的時間的話就會比正常時間少了八個小時。所以需要修改MySql的系統時區,使其顯示的時間和我們現在的時間一致。
  1)檢視mysql系統時間

select now(); 

  2)設定時區更改為東八區

set global time_zone = '+8:00';

  3)重新整理許可權

flush privileges; 

  4)退出後重新登入,即可。

三、修改資料庫的驅動

  若時間還是不對,有可能是驅動的問題,檢查下驅動資訊,如果連線引數中的欄位serverTimezone設定為UTC,將UTC更改為 Asia/Shanghai就可以了。

jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia
/Shanghai

四、檢視和修改Linux伺服器上的時區

  對於部署在海外的Linux伺服器來說,拿到的機器時區和本地並不一樣,導致執行在上面的應用也面臨時區問題,所以有必要修改Linux伺服器上的時區。
  1、檢視伺服器當前的時區
  檢視當前生效的時區,可以通過date -R命令來檢視當前時間。

[[email protected] ~]$ sudo date -R
Sun, 19 Aug 2018 15:18:38 +0800

  注:+0800,即東8區。
  2、設定時區
  1)通過tzselect命令檢視時區嚮導
  tzselect命令看起來很像一個時區選擇的工具,但並非如此。事實上tzselect僅僅是一個檢視時區表示方式的『嚮導』程式而已

。通過依次詢問大洲→國家→城市,最後告訴你如何TZ變數的寫法,比如北京時間是:Asia/Shanghai。
  2)通過修改*TZ變數,直接修改時區資訊*
  可以通過修改TZ變數,直接修改時區資訊,比如:

[webadmin@host ~]$ sudo date -R
Sun, 19 Aug 2018 15:25:15 +0800
[webadmin@host ~]$ sudo export  TZ='Asia/Shanghai'
[webadmin@host ~]$ sudo date -R              
Sun, 19 Aug 2018 15:25:51 +0800

  有Linux經驗的小夥伴都知道,不寫在檔案裡的設定更改很難生效一般是會話級的,重新登入會消失。所以,這樣直接修改TZ的尿性絕對做不到持久化更改時區的。
  正確的方式是到/etc/profile裡(或使用者的.profile或.bashrc檔案),直接export TZ變數為要更改的時區(時區的名字可以用tzselect嚮導來確定)。
  3)重啟相關service或者直接重啟伺服器
  4)通過/etc/localtime檔案修改時區
  預設情況下情況下,TZ屬性是空,這時候是靠/etc/localtime檔案來確定的時區。而此檔案通常又是一個到/usr/share/zoneinfo/下各種時區檔案的軟連線。通過修改/etc/localtime指向的軟連線,進而修改系統的時區。比如下面的方法,將localtime檔案設定為了北京時間:
 

 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

四、參考文章

  Linux檢視和修改時區