开发踩坑之数据库时区问题

1,709 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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,祝你升职、加薪、不提桶!