问题描述
我有这个 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 不支持 ZonedDateTime
、Instant
和 OffsetTime / TIME [ WITHOUT TIMEZONE ]
。