将Json解析为分区日期时间

时间:2017-05-24 10:16:20

标签: java jackson

我正在追随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解析

我尝试了多种解决方案,但似乎没有一种解决方案......

2 个答案:

答案 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);