開發踩坑之資料庫時區問題

語言: CN / TW / HK


theme: qklhk-chocolate highlight: vs2015


小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

WangScaler: 一個用心創作的作者。

宣告:才疏學淺,如有錯誤,懇請指正。

開發過程中,往往需要給表加上時間,而當我們把時間存到資料庫之後卻神奇的消失了八個小時。是怎麼回事?通過地理知識我們知道北京時間是東八區,也就是說我們的時間需要在UTC的時間上加八個小時。

那麼我們難道要在程式生成的時間後邊加上八小時?當然不是,我們只需要將資料庫的時間轉為北京時間即可。

Mysql

一、設定主機的時區

1、修改主機的時區

我們在Mysql官網得知,當Mysql伺服器啟動時,它會嘗試確定主機的時區並使用它來設定 system_time_zone系統變數。此後該值不會更改。那麼也就是說第一種辦法就是直接修改主機的時區。

tzselect 選擇4、Asia 選擇9、China 選擇1、Beijing Time 選擇1、Yes

即可

2、檢查主機的時間

date

檢視當前主機的時間是否正確

二、修改Mysql的時區

1、修改

  • 臨時更改,重啟將丟失

    mysql> set time_zone = '+8:00'; mysql> set global time_zone = '+8:00';

  • 永久更改,改完重啟

    ``` vim /etc/my.cnf

    在檔案中加入

    default-time_zone = '+8:00'

    重啟mysql

    systemctl restart mysqld ```

2、檢查設定結果

```

可檢視全域性的時區設定和會話的時區設定

select @@global.time_zone,@@session.time_zone; ​ show variables like '%time_zone%';

檢視當前時間

select now(); ```

三、修改連線的URL

jdbc:mysql://localhost:3306/mydemo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai

Mongo

Mongo相對比於Mysql就不一樣了,Mongo對於時區問題的看法就是不改,你就以UTC存。我們總不能每次存的時候轉成UTC,取的時候再轉回來吧。我是用的是Motor,所以這裡以Motor為例,只需要在連線的時候設定上時區,便可自動轉為北京時間。

AsyncIOMotorClient(self.motor_uri, retryWrites=False, io_loop=self.loop, tz_aware=True,                          tzinfo=pytz.timezone('Asia/Shanghai'))

最後

前人栽樹,後人乘涼。前人踩坑,後人繼續掉,哈哈哈哈。原你不是踩完坑才看到本文,而是先看完本文再踩坑。

來都來了,點個贊再走唄!

關注WangScaler,祝你升職、加薪、不提桶!