[“ last_modified”])]的根本原因 java.time.format.DateTimeParseException:无法解析文本'2018-06-06T13:19:53 + 00:00',未解析的文本位于索引19
入站格式为2018-06-06T13:19:53+00:00
这是一种奇怪的格式。
我尝试了以下方法:
public class XYZ {
@DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss+00:00", iso = ISO.DATE_TIME)
private LocalDateTime lastModified;
}
答案 0 :(得分:1)
入站格式为
2018-06-06T13:19:53+00:00
这是一种奇怪的格式。
这是ISO 8601格式,得到RFC 3339和xkcd 1179的认可:
在将值作为查询参数接收时,以下各项应可正常工作:
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDate dateTime;
由于2018-06-06T13:19:53+00:00
代表的日期和时间与UTC有所偏差,因此最好使用OffsetDateTime
而不是LocalDateTime
:
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private OffsetDateTime dateTime;
只需确保将+
编码为%2B
。
使用Jackson,您可以将jackson-datatype-jsr310
依赖项添加到您的应用程序中。此模块将为您提供serializers类型的deserializers和java.time
。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
然后在您的JavaTimeModule
中注册ObjectMapper
模块:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Jackson将为您处理序列化和反序列化。
如果由于某种原因,您对UTC的偏移量不感兴趣,并且想继续使用LocalDateTime
,则可以扩展Jackson提供的LocalDateTimeDeserializer
并使用自定义的DateTimeFormatter
:
public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer {
public CustomLocalDateTimeDeserializer() {
super(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
}
然后注释LocalDateTime
字段,如下所示:
@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
private LocalDateTime dateTime;
答案 1 :(得分:1)
没有什么可以阻止您创建自己的解串器。以下是一个非常幼稚的示例:
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss+00:00";
private final DateTimeFormatter formatter;
public LocalDateTimeDeserializer() {
this.formatter = DateTimeFormatter.ofPattern(PATTERN);
}
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return LocalDateTime.parse(p.getText(), formatter);
}
}
您唯一需要注意的是,您需要通过在单引号周围加上单引号来转义“ T”。
使用解串器,您可以像这样简单地注释字段:
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime dateTime;
答案 2 :(得分:0)
入站格式为2018-06-06T13:19:53 + 00:00
如果您可以在整个ObjectMapper上设置日期格式,则可以执行以下操作:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
objectMapper.setDateFormat(df);
中示例的一部分