[英]Inconsistent behaviour of Jackson's JsonFormat for Old Date API and 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 不支持ZonedDateTime
、 Instant
和OffsetTime / TIME [ WITHOUT TIMEZONE ]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.