@jsonformat未正确分析ZoneDateTime

bvpmtnay  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(507)

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

6yoyoihd1#

字符串中表示的日期和时间 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);
 }
mwecs4sa

mwecs4sa2#

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

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不支持 ZonedDateTime , Instant 以及 OffsetTime / TIME [ WITHOUT TIMEZONE ] .

相关问题