gpt4 book ai didi

java - Jackson/JavaTimeModule - 处理不同的时区偏移格式

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:31 24 4
gpt4 key购买 nike

我正在调用一个 API(使用 Jersey),它返回带时区偏移的日期时间。有时数据采用这种格式:

"2017-03-28T14:40:00+01:00"

有时是这种格式(我无法控制)

"2017-03-28T14:40:00+0100"  (where the ':' in timezone offset is missing).

我想将这些编码为 java.time.ZonedDateTime对象。我正在使用 JavaTimeModule()在我的 Jersey 里ObjectMapper .

objectMapper.registerModule(new JavaTimeModule());

问题:是否有任何方法可以使对象映射器足够灵活以处理 +01:00 中的时区偏移?或 +0100

最佳答案

您可以指定一个带有可选部分的模式(由 [] 分隔),以指示偏移量可以有 2 种不同的格式,并使用 @JsonFormat 将其添加到相应的字段 注释。

我已经创建了这个测试类:

public class SampleType {

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss[XXX][XX]")
private ZonedDateTime date;

// getter and setter
}

注意最后一部分 ([XXX][XX]):每对 [] 都是可选部分,因此解析器会尝试解析每个部分,如果当前的。 XXX 是带有 : 的偏移量,XX 是没有它的偏移量(有关更多详细信息,请查看 javadoc )

有了这个,两种格式都可以读取:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

// offset with ":"
String json = "{ \"date\": \"2017-03-28T14:40:00+01:00\" }";
SampleType value = mapper.readValue(json, SampleType.class);
System.out.println(value.getDate()); // 2017-03-28T13:40Z[UTC]

// offset without ":"
json = "{ \"date\": \"2017-03-28T14:40:00+0100\" }";
value = mapper.readValue(json, SampleType.class);
System.out.println(value.getDate()); // 2017-03-28T13:40Z[UTC]

请注意,生成的 ZonedDateTime 的值已转换为 UTC:2017-03-28T13:40Z[UTC]

如果你想保持原来的偏移量,只需使用com.fasterxml.jackson.databind.DeserializationFeature类来配置ObjectMapper:

// add this to preserve the same offset (don't convert to UTC)
mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

有了这个,偏移量将被保留(值不会转换为 UTC),上述测试的输出将是 2017-03-28T14:40+01:00

关于java - Jackson/JavaTimeModule - 处理不同的时区偏移格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43237347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com