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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eumenides_/article/details/82698156

项目快要上线了,突然测试问我为什么我测试的部分数据其中生日字段比我设置生日时候少一天呢?我当时回答怎么可能,同样的生日字段保存的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的部分月中

没有更多推荐了,返回首页