最近给客户部署项目时,由于项目在开发过程中
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
均可,可自行选择。