首页 > 其他分享 >@JsonFormat注解出现日期序列化以及反序列化问题(日期比实际日期少一天)

@JsonFormat注解出现日期序列化以及反序列化问题(日期比实际日期少一天)

时间:2024-05-25 19:00:45浏览次数:17  
标签:JsonFormat 指定 问题 日期 注解 序列化

文章目录


前言

  在一次的偶然机会下发现了一个小问题,场景是这样的:新增员工信息,里面包含一个参加工作的时间,和进入公司的时间,当我查询这个员工的数据时,发现查询出来的时间都少了一天,但是看数据库存储的数据又是对的,那么这是为什么呢?


一、场景如下所示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


二、问题分析

  既然数据库数据是正常的,说明插入数据的传输是没问题的,那么就只能是查询出了问题,接着我就对查询接口进行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 注解时出现日期问题

  1. 时区问题:如果你的服务器和客户端位于不同的时区,或者你的数据库存储的是 UTC 时间而你的应用服务器是本地时间,这可能会导致日期偏差。确保你的应用正确处理时区。

  2. 日期格式问题:@JsonFormat 允许你指定日期格式,如果格式不正确或者与实际日期不匹配,也可能导致日期错误。检查你的日期格式字符串是否正确。

  3. 序列化/反序列化配置问题:确保你的 Jackson 配置正确,比如 ObjectMapper 的配置,是否正确处理了日期。

  4. 数据库存储问题:如果你的数据库存储的是时间戳,并且时间戳是基于某个特定的时区,那么在转换为日期时可能会出现偏差。

  5. 注解使用问题:检查 @JsonFormat 注解的使用是否正确,比如是否正确地应用在了字段上,以及注解的属性是否设置正确。


总结

  • 本文简单讲述了使用@JsonFormat注解出现日期问题,比如日期比实际数据日期少一天等,着重讲了产生的原因和解决方式。
  • 欢迎大家提出建议以及批评,有任何问题可以私信。

标签:JsonFormat,指定,问题,日期,注解,序列化
From: https://blog.csdn.net/weixin_45260582/article/details/138859598

相关文章

  • Golang 序列化与反序列化,包含字段首字母小写和字段时间格式化
     golang结构体json的时间 序列化与反序列化 格式化解决方案 //最近开发项目时候发现一个结构体的Json转换的时间格式问题。//即这种1993-01-01T20:08:23.000000028+08:00这种表示UTC方法。//从我们习惯来说,更喜欢希望的是1993-01-0120:08:23这种格式如......
  • LocalDateTimeDemo 日期 时间 字符串转换
    packagedemo;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassLocalDateTimeDemo{ publicstaticvoidmain(String[]args){ LocalDateld1=LocalDate.now(); DateTimeFormatterdtf1......
  • 类转词典 转json 序列化 魔术方法
      classTest:def__init__(self,totals,uniques,pre):self.totals=totalsself.uniques=uniquesself.cumulative_sum=totalsifpre:self.cumulative_sum+=pre.cumulative_sumpre=Test(......
  • 判断日期是否在7天之内
    判断日期是否在7天之内Datedate=newDate();//获取当前时间Dates00=(Date)pageData.get("addTime");//获取需要比较的目标时间Calendarcalendar=Calendar.getInstanc......
  • 序列化和反序列化
    1.什么是序列化和反序列化?序列化:把对象转化为可传输的字节序列过程称为序列化。反序列化:把字节序列还原为对象的过程称为反序列化。2.序列化的目的? 序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的......
  • layui laydate日期时间范围,时间默认设定为23:59:59
    在Layui中,如果你想设置日期时间选择器(datetime)的默认结束时间为当天的23:59:59,你可以使用如下代码(红色部分):laydate.render({elem:'#test10',type:'datetime',range:true,max:'{:date("Y-......
  • 序列化与反序列化
    引用DLL文件:Newtonsoft.Json.dll路径:D:\yonyou\U9CE\Portal\bin\C#实体类List<Departments>deptss=newList<Departments>();privatevoidDepartment_Load(objectsender,EventArgse){strUri=TexURI.......
  • Jackson 库中@JsonProperty和@JsonAlias注解实现序列化反序列化
    Json序列化一般为实体转化生成的JSON数据中直接包含嵌套对象的属性ObjectMappermapper=newObjectMapper();Bookbook=newBook("LearningJava","Java");Writerwriter=newWriter(110,"Mohit",book);StringjsonWriter=......
  • Java常用的JSON序列化与反序列化工具实践
    JSON简介:JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,通常用于在不同系统之间传输数据。它基于JavaScript对象语法,但已成为一种独立于语言的格式。JSON数据以键值对的形式组织,易于阅读和编写。为什么要使用JSON?1.简单易用:JSON的语法简单,易于理解和编写,可以......
  • 【C#】读取文件反序列化对应类
    ///<summary>///反序列化///</summary>///<paramname="filePath">文件路径</param>///<returns></returns>publicstaticList<T>JsonToList<T>(stringfilePath){stringjsonStr=File.ReadAllText(fi......