java 不同時區,Jackson / JavaTimeModule – 处理不同的时区偏移格式

我正在调用一个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对象中.我在Jersey ObjectMapper中使用JavaTimeModule().

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值