最近給客戶部署項目時,由于項目在開發過程中
python
的now()
和utcnow()
的混合使用,導致部署環境變化時,數據庫中的數據在時間展示上出現了bug
1、時區設置
2、項目開發中的使用
- 數據庫中數據篩選的時間設置
- 定時任務的時間設置
總結
- 所有的Linux系統文件系統底層存儲的都是
UTC
時間,也就是說都是自1970年0時0分0秒以來的UTC標準時間的秒數。 -
mysql
底層存儲的時間為UTC
時間,和設置的時區無關,而時區僅僅是在讀取的時候,用以時間轉化。 -
python
使用utcnow()
獲取的為UTC
時間,使用now()
獲取的為系統時區的時間。
使用建議
-
mysql
時區設置為本地時區- 原因:因為數據庫中的數據本身就是為展示使用,在開發的項目無國際化需求的時候,建議使用本地時區也就是
CST
,此時前端可以直接展示。
- 原因:因為數據庫中的數據本身就是為展示使用,在開發的項目無國際化需求的時候,建議使用本地時區也就是
- 系統時區:盡量和
mysql
時區保持一致- 原因:1、
mysql
使用UTC
時區時,系統也使用UTC
時區,此時前端的時間展示統一進行+8h
處理;2、mysql
使用CST
時區時,系統也使用CST
時區,雖然只要mysql
使用CST
時區時,前端即可直接顯示,不用處理,但是此時python
的now()
和utcnow()
值相同,均比CST
小8h
,在同數據庫進行比較時,需要使用+8h
處理,簡直自找麻煩。
- 原因:1、
- 定時任務:使用
CST
和UTC
均可,可自行選擇。