中国夏令时导致的一起前端展示的时间比后台少一天奇葩案例

项目快要上线了,突然测试问我为什么我测试的部分数据其中生日字段比我设置生日时候少一天呢?我当时回答怎么可能,同样的生日字段保存的date日期怎么可能部分数据会少一天,于是我就让测试指出哪几条数据有问题,然后我对照mysql看了一下,卧槽!什么鬼,真的是尼玛少了一天,举个栗子:
mysql:1989-04-10
前端:1989-04-09
卧槽,神特么见鬼了,于是一波断点打起来发现有问题的数据在往前台返回时候居然自动变成了1989-04-09 23:00:00,
实际上是少一小时但是由于是生日只展示到日因此时间就截掉了,到前端显示就变成少一天
一番百度之后,说实话遇到这种问题的不多,能搜到的博客寥寥无几,记一下我看到的办法吧

  1. 生日字段上用@JsonFormat(pattern = “yyyy-MM-dd”, timezone = “GMT+8”)注解,后面要加上时区
    首先这个注解我不用,而且这个注解不太好,我是对时间统一处理了,但是还是报了试一试心态,结果不行

  2. 在getBirthday()方法返回前加上TimeZone.setDefault(TimeZone.getTimeZone(“GMT+08”));,结果也不行

  3. 还有一个设置JVM参数,首先我在idea里设置了一下,启动项目发现ok,看图
    这里写图片描述
    由于我项目是springboot的,打的是jar包,所以启动时候配上了jvm参数,看命令:

nohup java -jar -Duser.timezone=GMT+08 /opt/loanmarket-0.0.1-SNAPSHOT.jar &> /dev/null &

启动后看一下界面显示ok,自此完美解决
至于原因吗,看一下这篇文章,我测试发现这种问题基本出现在1985~1991的部分月中

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值