文章目录
前言
在一次的偶然机会下发现了一个小问题,场景是这样的:新增员工信息,里面包含一个参加工作的时间,和进入公司的时间,当我查询这个员工的数据时,发现查询出来的时间都少了一天,但是看数据库存储的数据又是对的,那么这是为什么呢?
一、场景如下所示
二、问题分析
既然数据库数据是正常的,说明插入数据的传输是没问题的,那么就只能是查询出了问题,接着我就对查询接口进行debuger,但跟了一遍代码发现数据都是没问题的,最后发现是controller响应数据对数据进行JSON序列化后日期才少了一天,那么问题就很简单了,看看JSON序列化为什么会少一天,进行进一步排查发现是因为使用@JsonFormat
注解不当的问题,情况如下:
三、@JsonFormat注解是什么
@JsonFormat 注解是 Jackson 库提供的一个功能,它允许你控制 Java 对象序列化成 JSON 字符串时日期和时间的格式,以及反序列化时的行为。这个注解可以应用于 Java 类的字段、getter 方法或者类本身。
以下是 @JsonFormat 注解的一些常用属性:
- shape:指定输出的日期时间形状,可以是 STRING(默认)、NUMBER 或 DATE。
- pattern:指定日期时间的格式,例如 “yyyy-MM-dd HH:mm:ss”。
- timezone:指定时区,例如 “GMT+8” 或 “UTC”。
- locale:指定地区设置,用于格式化日期。
- lenient:指定解析日期时是否宽松,true 表示宽松,false 表示严格。
- date:如果 shape 是 NUMBER,则指定日期时间的类型,可以是 java.util.Date 或 java.sql.Date。
- pattern 属性通常与 shape 为 STRING 时一起使用,定义日期时间字符串的格式。
四、解决问题
问题原因:我们在格式化的时候要指定时区(timezone ),是因为@JsonFormat注解默认的时区为格林尼治时间,比中国时间(东八区是要小8个小时的),所以查询接口返回时进行JSON序列化时就减少了8小时,从而导致出现少了一天的情况。
解决方式:只需要指定对应的时区就好
效果如下:
五、@JsonFormat 注解时出现日期问题
-
时区问题:如果你的服务器和客户端位于不同的时区,或者你的数据库存储的是 UTC 时间而你的应用服务器是本地时间,这可能会导致日期偏差。确保你的应用正确处理时区。
-
日期格式问题:@JsonFormat 允许你指定日期格式,如果格式不正确或者与实际日期不匹配,也可能导致日期错误。检查你的日期格式字符串是否正确。
-
序列化/反序列化配置问题:确保你的 Jackson 配置正确,比如 ObjectMapper 的配置,是否正确处理了日期。
-
数据库存储问题:如果你的数据库存储的是时间戳,并且时间戳是基于某个特定的时区,那么在转换为日期时可能会出现偏差。
-
注解使用问题:检查 @JsonFormat 注解的使用是否正确,比如是否正确地应用在了字段上,以及注解的属性是否设置正确。
总结
- 本文简单讲述了使用@JsonFormat注解出现日期问题,比如日期比实际数据日期少一天等,着重讲了产生的原因和解决方式。
- 欢迎大家提出建议以及批评,有任何问题可以私信。