Spring boot:JSON将带有时区的日期和时间反序列化为LocalDateTime
Posted
技术标签:
【中文标题】Spring boot:JSON将带有时区的日期和时间反序列化为LocalDateTime【英文标题】:Spring boot: JSON deserialize date and time with time zone to LocalDateTime 【发布时间】:2021-05-22 04:14:51 【问题描述】:我正在使用 Java 11,Spring Boot 2.2.6.RELEASE。如何将“2019-10-21T13:00:00+02:00”反序列化为 LocalDateTime?
到目前为止尝试过:
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@DateTimeFormat(iso = ISO.DATE_TIME)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
private LocalDateTime startTime;
但我收到以下错误:
2021-02-19 07:45:41.402 WARN 801117 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String "2019-10-21T13:00:00+02:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2019-10-21T13:00:00+02:00' could not be parsed, unparsed text found at index 19; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "2019-10-21T13:00:00+02:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2019-10-21T13:00:00+02:00' could not be parsed, unparsed text found at index 19
at [Source: (PushbackInputStream); line: 2, column: 18] (through reference chain: example.app.dto.DtoRequest["startTime"])]
【问题讨论】:
这能回答你的问题吗? Deserialize Java 8 LocalDateTime with JacksonMapper 显示的值包含时区偏移量,应映射到OffsetDateTime
,而不是LocalDateTime
。
@RoarS。 - 你提到的重复目标没有回答这个问题。详情请查看下方答案。
【参考方案1】:
您的代码有两个问题:
1。使用错误的类型
无法从 String 反序列化
java.time.LocalDateTime
类型的值 “2019-10-21T13:00:00+02:00”:反序列化失败 java.time.LocalDateTime: (java.time.format.DateTimeParseException) 无法解析文本“2019-10-21T13:00:00+02:00”,未解析文本 在索引 19 找到
如果你分析错误信息,你会发现它清楚地告诉你索引19有问题。
2019-10-21T13:00:00+02:00
// index 19 ----> ^
而且,问题在于LocalDateTime
不支持时区。下面给出的是overview of java.time types,您可以看到与您的日期时间字符串匹配的类型是OffsetDateTime
,因为它的区域偏移量为+02:00
小时。
如下更改您的声明:
private OffsetDateTime startTime;
2。使用错误的格式
您需要将XXX
用于偏移部分,即您的格式应为uuuu-MM-dd'T'HH:m:ssXXX
。如果要坚持使用Z
,则需要使用ZZZZZ
。查看documentation page of DateTimeFormatter
了解更多详情。
演示:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
public class Main
public static void main(String[] args)
String strDateTime = "2019-10-21T13:00:00+02:00";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:m:ssXXX");
OffsetDateTime odt = OffsetDateTime.parse(strDateTime, dtf);
System.out.println(odt);
输出:
2019-10-21T13:00+02:00
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
也相关,RFC3339 - 互联网上的日期和时间:时间戳
本文档定义了用于 Internet 的日期和时间格式ISO 8601 标准的概要协议 使用公历表示日期和时间。
【讨论】:
以上是关于Spring boot:JSON将带有时区的日期和时间反序列化为LocalDateTime的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Boot 和 Jackson 的日期时区
Spring-boot @RequestBody JSON 到带有日期反序列化示例的对象?