我正在调用一个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()
使用ObjectMapper
。
objectMapper.registerModule(new JavaTimeModule());
问题:有没有办法让对象映射器具有足够的灵活性来处理+01:00
或+0100
中的时区偏移?
答案 0 :(得分:2)
您可以指定带有可选部分的模式(由[]
分隔),以指示偏移量可以有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
。