我正在使用Dropwizard来实现一些REST Web服务。
用户将使用iso格式发送日期时间,如:"beginTime": "2016-03-30T16:56:35.43-10:00"
我需要得到用户发送的本地日期和时间或偏移量。
Jackson似乎丢失了偏移信息,并将日期设置为UTC。在从json反序列化的对象中,我得到了2016-03-31T02:56:35.430Z
,我尝试了所有类型(Calendar
、DateTime
、Date
)。
我需要知道偏移量或用户的日期来计算用户时区的每日统计数据。
我试过DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE
,但没有成功。
如何获取偏移量或/和输入日期?
对于java8,您可以使用jackson-datatype-jsr310库来反序列化ZonedDateTime
实例。您必须注册一个JavaTimeModule
并禁用反序列化功能ADJUST_DATES_TO_CONTEXT_TIME_ZONE
:
String json = ""2016-03-30T16:56:35.430-10:00"";
ObjectMapper mapper = new ObjectMapper();
JavaTimeModule javaTimeModule=new JavaTimeModule();
mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
mapper.registerModule(javaTimeModule);
ZonedDateTime obj = mapper.readValue(json, ZonedDateTime.class);
System.out.println(obj);
//prints: 2016-03-30T16:56:35.430-10:00
或者,您可以通过添加库jackson数据类型joda并注册JodaModule
来反序列化org.joda.time.DateTime
实例。
String json = ""2016-03-30T16:56:35.430-10:00"";
ObjectMapper mapper = new ObjectMapper();
JodaModule jodaModule=new JodaModule();
mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
mapper.registerModule(jodaModule);
DateTime obj = mapper.readValue(json, DateTime.class);
System.out.println(obj);
//prints: 2016-03-30T16:56:35.430-10:00