Java 将Json解析为分区日期时间

Java 将Json解析为分区日期时间,java,jackson,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 ext

我收到以下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());
    }
}
公共类JsonZonedDateTimeDeserializer扩展JsonDeserializer{
@凌驾
公共分区DateTime反序列化(JsonParser jp,反序列化上下文ctxt)引发IOException{
返回ZonedDateTime.parse(jp.getText());
}
}
但是我得到了:

无法在索引10处分析文本“2017-05-24 09:52:51+02:00”


我尝试了多种解决方案,但似乎都不起作用…

您不应该试图将其解析为
ZoneDateTime
,因为它实际上没有时区-它有UTC偏移量
OffsetDateTime
在这里更合适。区分这两种类型是值得的-您可以创建一个带有固定UTC偏移的时区的
ZoneDateTime
,但您应该了解,这与“常规”时区不同。如果只在一个瞬间有偏移量,
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);
    }       
}

您不应该试图将其解析为
zoneDateTime
,因为它实际上没有时区-它有UTC偏移量
OffsetDateTime
在这里更合适。区分这两种类型是值得的-您可以创建一个带有固定UTC偏移的时区的
ZoneDateTime
,但您应该了解,这与“常规”时区不同。如果只在一个瞬间有偏移量,
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);
    }       
}
您可以只使用:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssXXX");
return ZonedDateTime.parse(jp.getText(), dateTimeFormatter);
您可以只使用:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssXXX");
return ZonedDateTime.parse(jp.getText(), dateTimeFormatter);

@filemonczyk:不太清楚你的意思,但我提供的代码在我的机器上运行,根据文档,X的数量是经过深思熟虑的:“五个字母输出时分和可选秒,带有冒号,如“+01:30:15”@filemonczyk:不太清楚你的意思,但我提供的代码在我的机器上运行,根据文档,X的数量是经过深思熟虑的:“五个字母输出小时和分钟,可选秒,带冒号,如“+01:30:15”