JsonFormat遇到夏时制

简介: 前段时间遇到一个离谱的问题,用户的生日通过后端返回直接少了一天,debug半天发现每次在调试时数据库返回都是正确的值,但是接口响应体中莫名奇妙,减少一天。

调试过程:

开始就采用debug看是不是数据库搞的鬼,发现数据从数据库拿出一切正常。

这就很怪异,为啥数据是对的接口响应就出问题了呢?

然后多测几组数据发现更诡异,有的日期就很正常,有的日期就不行,尤其是和这个用户生日相近的日期,出现少一天的几率很高。然后我就增加测试用例,多测几组数据将出错时间定在1886年-1991年。而且我将@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT + 8") 调整为@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT + 8")判断它是不是因为时区造成的,发现这个日期只比正常的少一个小时,显然不是因为时区问题。

然后我就去百度搜索这个时间节点少一个小时,找到一个概念就是夏时制

1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行,时间调快1小时。

发现就是因为JsonFormat没有对夏时制进行处理,导致的。然后我从查询了相关的解决方案。

JsonFormat 是源于SpringBoot包下的,不确定的是高版本是否有相关优化。

解决方案:

一、使用虚拟机参数

-Duser.timezone=GMT+08

# 启动时加入
java -java test.jar -Duser.timezone=GMT+08

二、使用SimpleDateFormat 格式化

SimpleDateFormat 格式化 Date 经测试没有这个问题,可以手动用这种方式格式化 或者用字符串拼接的方式,具体还要考虑业务场景。

目录
相关文章
|
3月前
|
存储 JSON 前端开发
【Java】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天
在实际项目中,使用 `@JsonFormat(pattern = "yyyy-MM-dd")` 注解导致出生日期少了一天的问题,根源在于夏令时的影响。本文详细解析了夏令时的概念、`@JsonFormat` 注解的使用方法,并提供了三种解决方案:在注解中添加 `timezone = GMT+8`、修改 JVM 参数 `-Duser.timezone=GMT+08`,以及使用 `timezone = Asia/Shanghai
365 0
【Java】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天
|
4月前
Jackson 使用 @JsonFormat 注解进行时间格式化
Jackson 使用 @JsonFormat 注解进行时间格式化
492 2
|
4月前
|
存储 安全 Java
使用SimpleDateFormat进行日期格式化
使用SimpleDateFormat进行日期格式化
|
5月前
@DateTimeFormat与@JsonFormat
@DateTimeFormat与@JsonFormat
|
前端开发
【注解使用】@JsonFormat与@DateTimeFormat注解的使用
【注解使用】@JsonFormat与@DateTimeFormat注解的使用
191 0
|
Java
LocalDateTime序列化成yyyy-MM-dd HH:mm
LocalDateTime序列化成yyyy-MM-dd HH:mm
244 0
SimpleDateFormat的pattern
SimpleDateFormat的pattern
有关日期格式化的问题
有关日期格式化的问题
104 0
|
前端开发 Java Spring
【小家Spring】@DateTimeFormat和@NumberFormat以及@JsonFormat的使用
【小家Spring】@DateTimeFormat和@NumberFormat以及@JsonFormat的使用
【小家Spring】@DateTimeFormat和@NumberFormat以及@JsonFormat的使用
|
存储 前端开发 Java
@JsonFormat与@DateTimeFormat的区别
@JsonFormat与@DateTimeFormat的区别
364 0