【问题标题】:@JsonFormat is not parsing ZonedDateTime correctly@JsonFormat 没有正确解析 ZonedDateTime
【发布时间】:2021-07-17 14:00:11
【问题描述】:

我有这个 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).

【问题讨论】:

    标签: java json spring-boot rest zoneddatetime


    【解决方案1】:

    字符串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);
     }
    

    【讨论】:

    • OffsetDateTime 将无法使用模式 2020-02-28T05:50:24.000+02:00 解析 yyyy-MM-dd'T'HH:mm:ss.SSSZ
    • 感谢您的输入,因为他覆盖了setter 方法,我相信杰克逊在反序列化过程中不会使用该格式@ArvindKumarAvinash
    【解决方案2】:

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

    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 ]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多