我正在追随json时间格式
"TimeEnd": "2017-05-24 09:52:51+02:00"
我的dto如下:
@JsonProperty("TimeEnd")
@JsonDeserialize(using = JsonZonedDateTimeDeserializer.class)
private ZonedDateTime timeEnd;
我写了下面的反序列化器
public class JsonZonedDateTimeDeserializer extends JsonDeserializer<ZonedDateTime> {
@Override
public ZonedDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
return ZonedDateTime.parse(jp.getText());
}
}
但是我得到了:
文字'2017-05-24 09:52:51 + 02:00'无法在索引10解析
我尝试了多种解决方案,但似乎没有一种解决方案......
答案 0 :(得分:1)
您不应该尝试将其解析为ZonedDateTime
,因为它实际上没有具有时区 - 它具有UTC偏移量。 OffsetDateTime
在这里更合适。值得区分这两种类型 - 你可以创建一个ZonedDateTime
,其时区只是一个固定的UTC偏移量,但你应该明白这与“常规”时间不一样区。如果您在一个瞬间只有偏移量,OffsetDateTime
会更好。
现在因为您的输入值没有标准模式所需的“T”,您需要使用自定义模式,但这很简单:
import java.time.*;
import java.time.format.*;
import java.util.*;
public class Test {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ssXXXXX", Locale.ROOT);
String text = "2017-05-24 09:52:51+02:00";
OffsetDateTime odt = OffsetDateTime.parse(text, formatter);
System.out.println(odt);
}
}
答案 1 :(得分:1)
您可以使用:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssXXX");
return ZonedDateTime.parse(jp.getText(), dateTimeFormatter);