数据库插入时间类型数据,存储值与插入值相差1小时/13小时 java

本文介绍了在使用Java与MySQL交互过程中遇到的由于CST(标准时间)与CDT(夏令时)时区差异导致的时间戳错误问题。通过调整MySQL的时区配置为Asia/Shanghai并相应地配置JsonFormat的timezone属性,最终解决了时间数据在前后端显示不一致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排查思路

  1. 查看插入值是否正确无误
  2. 插入值是否因为进行字符串与其他类型转变导致值发生变化
  3. 查看sql 是否正确无误
  4. 查看数据库插入时打印日志是否无误
  5. 判断数据库链接时区问题

遇到的问题复现

本人是用esayexcel 导入数据,导入后发现 数据中有CDT 格式和CST格式,所以问题就出现这个CDT上 如果不知道这两个的区别大家可以自行百度,

摘要
名为 CST 的时区是一个很混乱的时区,在与 MySQL 协商会话时区时,Java 会误以为是 CST -0500,而非 CST +0800。

CST 时区
名为 CST 的时区是一个很混乱的时区,有四种含义:

  • 美国中部时间 Central Standard Time (USA) UTC-06:00
  • 澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
  • 中国标准时 China Standard Time UTC+08:00
  • 古巴标准时 Cuba Standard Time UTC-04:00

今天是“4月28日”。为什么提到日期?因为美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。

解决方案

解决方案:

查看问题真正产生的原因。

  1. 打印获取到日期,发现两个日期存在了时区的不同,一个为CDT,一个为CST;
  2. CDT:为夏令时时间(中华人民共和国在1986年~1991年实行了夏令时制度,每年夏令时实行时间如下:
    1986年5月4日至9月14日(1986年因是实行夏令时的第一年,从5月4日开始到9月14日结束)
    1987年4月12日至9月13日,
    1988年4月10日至9月11日,
    1989年4月16日至9月17日,
    1990年4月15日至9月16日,
    1991年4月14日至9月15日。
    );CST:为美国、澳大利亚、古巴或中国的标准时间。
  3. CST的时间和CDT的时间是相差了13个小时。
    解决方案:
    常用的CMT+8的时区设置,并不兼容夏令时。
    而使用TimeZone = Asia/Shanghai,则会兼容夏令时。
    当mysql的url,修改为配置serverTimezone=Asia/Shanghai;解决了插入数据库时间错误问题。
    但是,当返回给前端的时候,设置JsonFormat的timeZone的时候,也需要使用此配置:@JsonFormat(timezone = “Asia/Shanghai”, pattern = “yyyy/MM/dd”);这样才可以保证前端的数据展示正确。

在这里插入图片描述
大佬博客:

https://blog.youkuaiyun.com/weixin_38608626/article/details/108378687

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值