Jackson 使用 @JsonFormat 注解进行时间格式化
2023-04-18 13:10:31 时间
本文为博主原创,未经允许不得转载:
最近帮同事定位了一个现网问题,记录一下:
项目中对所有请求的参数都进行了 Jackson 序列化,在接收请求的实体类字段上使用 @JsonFormat 注解,该注解的作用是将传入的时间格式化为 注解上指定的格式。在使用过程中 对 @JsonFormat 转换的字段与 string 日期字段转换为 date 类型的日期进行比较时,本来是相同的值,equal 比较时,返回结果为false。主要是由于使用 @JsonFormat 转换时,存在时区问题,才会导致异常。
使用@JsonFormat 进行格式化转换时,若未标明时区,则默认为 GMT 时区,年月日转换为date 时,会使用GMT 时区,会多 8 小时。若指定时区 timezone = "GMT+8" ,年月日字符串转换之后会是对应的北京时间的0点0分0秒。
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
封装一个测试类方法
package com.example.demo; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import java.util.Date; @Data public class JacksonTest { @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") private Date date; @JsonFormat(pattern="yyyy-MM-dd") private Date date2; public static void main(String[] args) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = "{"date":"2021-02-02","date2":"2021-02-02"}"; JacksonTest test = objectMapper.readValue(jsonStr,JacksonTest.class); System.out.println(test.getDate()); System.out.println(test.getDate2()); } }
该方法执行打印的结果如下:
Tue Feb 02 00:00:00 CST 2021
Tue Feb 02 08:00:00 CST 2021
通过 jackson 转换之后,差了8小时。
所以在使用过程中,一定要 注意 @JsonFormat 的时区问题。。。。
相关文章
- 数字孪生和人工智能如何助力可持续的未来
- 常用的云安全防护措施盘点
- 人工智能革命:保持竞争力的四个建议
- 运营商打电话通知改套餐,大优惠?全都是假象!被坑钱都不知道
- 添加K8S CPU limit会降低服务性能?
- 2023年机器人技术发展十大关键词 人形机器人入选
- 使用 Ebpf 加速 Istio 数据平面
- 阿里开源云原生混部系统Koordinator,助力提升计算资源利用率
- 锐捷发布RCIE认证,百万激励基金培养ICT人才
- 锐捷极简光斩获“2021年度数字化转型创新方案” 为以太全光网立标杆!
- 什么是云计算安全?云计算的三种服务模式是什么?
- 你知道吗?托管Kubernetes已成为常态
- 利用计算机视觉提高商业系统的安全性
- 聊聊云上自适应安全管理
- 当从Pod访问百度时会用到VTEP吗
- 是否有可能让人工智能变得更加透明?
- 人工智能能拯救医疗行业吗?
- 全球DevOps行业最新薪酬趋势
- 马斯克给猫咪造窝?
- 美联邦航空管理局:允许飞机在受5G影响的机场降落