關於資料庫與伺服器時區的問題
一、概述
最近在做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僅僅是一個檢視時區表示方式的『嚮導』程式而已
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