登录
  • 欢迎访问悠扬的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站😉

一个关于程序时区的大坑

Mysql 悠扬 491次浏览 已收录 0个评论

程序时间与数据库时间相差13小时或14小时,甚至相差20几个小时

一个关于程序时区的大坑

  在进行数据库开发的时候,和时间打交道就会涉及到时区,一个日期时间字段从

应用层 → 数据库客户端 → 数据库服务端 

传递过程中会跟以下几个时区打交道:

  • JVM 时区(默认取操作系统时区,见后文)
  • 数据库客户端设置的时区参数(serverTimezone),数据库会话的时区
  • 数据库服务端的时区(默认取操作系统时区,见后文)
  • 操作系统时区

要想在时区问题少踩坑(比如存在库里面的时间多了几个小时)可以这样做:

  • 数据库服务端的时区参数time_zone设置一个明确的值,比如+8:00。这个不是必须的,但是建议设置。

数据库客户端通过serverTimezone参数设置自己的时区,这一步至关重要,它应该程序打印出的时区,mysql的时区保持一致

System.out.println("==================="+TimeZone.getDefault());

我遇到的这个问题场景如下:serverTimezone  写成了大写 serverTimeZone  

jdbc:mysql://192.168.32.132:33080/demo_2021?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

mysql时区显示如下:

show variables like ‘%time_zone%’;
system_time_zone CST
time_zone SYSTEM

这时显示的时间:别怀疑,这特喵的还是没发生的时间,serverTimezone就这个参数写错

操作系统 mysql
[root@d-sn-003 ~]# date
2021年 03月 19日 星期五 13:58:33 CST
select now();
2021-03-20 02:59:38

一个关于程序时区的大坑

记录下,容器MySQL挂载时区相关,两者都是修改时区相关,一个是和操作系统保存同步,一个是直接指定

environment:
    MYSQL_ROOT_PASSWORD: 12345678
    TZ: Asia/Shanghai
volumes:
    - /etc/localtime:/etc/localtime

版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个关于程序时区的大坑
喜欢 (2)
支付宝[]
分享 (0)
悠扬
关于作者:
10年以上工作经验,从事2年微服务架构搭建工作,有大数据处理相关工作经验,使用spring全家桶包括:Spring,SpringBoot,SpringCloud 数据层组件服务使用SpringDataJpa,Mybatis以及其他第三方组件Sharding-JDBC,Sharding-Proxy分库分表。熟悉微服务,服务降级,限流,分流,做过项目源码修改,有cat,apollo,nacos使用经验,有Lostash,Elasticsearch,kibana,mysqlMHA生产实践经验,使用开源代码Apache Sarding项目,修改源码支持mysql分库分表使用年月日小时分库分表,docker做集群服务,Jekins做项目发布,GitLab做项目管理,使用docker容器部署,熟悉消息队列RabbitMQ,Kafka,ActiveMQ。RuoYi-Vue-Atomikos项目开源加入生态圈组件,项目支持分布式事务,界面添加多数据源,数据源动态配置,切面切换,多数据源事务支持,支持区域数据源配置,用于区域数据切分,数据层次分库。项目地址:https://gitee.com/zsiyang/ruoyi-vue-atomikos
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址