繁体   English   中英

@JsonFormat 没有正确解析 ZonedDateTime

[英]@JsonFormat is not parsing ZonedDateTime correctly

我有这个 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"
}

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

因此它给出了例外:

'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);
    }
}

Output:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM