小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
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,祝你升职、加薪、不提桶!