@JsonFormat 没有正确解析 ZonedDateTime

问题描述

我有这个 DTO:

public class TransactionRequestDTO {
    
   private zoneddatetime authDate;

    @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
     @JsonProperty("authDate")
     public void setAuthDate(String authDate) {
     this.authDate = zoneddatetime.parse(authDate);
   }
}

我正在使用此 json 进行 REST API 调用

{
  "instrumentDate": "2020-02-28T05:50:24.000+02:00"
}

但我收到的日期为 "2020-02-28T05:50:24.000+0200" 中的 setAuthDate()(不带“:”)。

因此它给出了例外:

'java.time.format.DateTimeParseException' at zoneddatetime.parse(authDate).

解决方法

字符串 2020-02-28T05:50:24.000+02:00 中表示的日期和时间是 ISO-8601 格式,因此您可以简单地使用 OffsetDateTime

@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
 @JsonProperty("authDate")
 public void setAuthDate(String authDate) {
 this.authDate = OffsetDateTime.parse(authDate);
}

如果您仍想格式化为 ZonedDateTime,只需使用具有正确模式的 DateTimeFormatter

 @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
 @JsonProperty("authDate")
 public void setAuthDate(String authDate) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    this.authDate = ZonedDateTime.parse(authDate,formatter);
 }
,

您的模式不正确。将其更改为以下模式之一:

yyyy-MM-dd'T'HH:mm:ss.SSSXXX

yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ

演示:

import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX",Locale.ENGLISH);
        String strDateTime = "2020-02-28T05:50:24.000+02:00";

        OffsetDateTime odt = OffsetDateTime.parse(strDateTime,dtf);
        System.out.println(odt);

        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime,dtf);
        System.out.println(zdt);
    }
}

输出:

2020-02-28T05:50:24+02:00
2020-02-28T05:50:24+02:00

此外,由于您的日期时间具有 +02:00 小时的时区偏移量,您应该考虑使用 OffsetDateTime 而不是 ZonedDateTime。一些数据库,例如PostgreSQL 不支持 ZonedDateTimeInstantOffsetTime / TIME [ WITHOUT TIMEZONE ]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...