从 Joda DateTime 对象访问原始本地时间
Accessing original local time from Joda DateTime object
我将以下 JSON 字符串转换为 Joda DateTime 对象(使用 Jackson)
"2015-08-02T11:30:00.000+01:00"
使用以下代码打印时间
DateTimeFormatter timeFmt = DateTimeFormat.forPattern("HH:mm");
String timePart = timeFmt.print(dt);
我得到:
10:30
哪个是正确的 UTC 时间。
不过我希望能够打印出原来的当地时间
11:30
如何从我的日期时间对象中获取这个(甚至 +01:00 的原始偏移量)?
谢谢,
肯尼
好的,我终于找到了解决办法。它不是最优雅的,我宁愿在应用程序中注册自定义对象映射器 context.xml 但无法正常工作..
无论如何,我在反序列化期间恢复 UTC 的原因是 Jackson 提供的 DateTime 反序列化器有意这样做:
public ReadableInstant deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
JsonToken t = jp.getCurrentToken();
if(t == JsonToken.VALUE_NUMBER_INT)
return new DateTime(jp.getLongValue(), DateTimeZone.UTC);
if(t == JsonToken.VALUE_STRING)
{
String str = jp.getText().trim();
if(str.length() == 0)
return null;
else
return new DateTime(str, DateTimeZone.UTC);
} else
{
throw ctxt.mappingException(getValueClass());
}
}
所以我创建了一个自定义对象映射器
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
SimpleModule module = new SimpleModule("DateTime", Version.unknownVersion());
module.addDeserializer(DateTime.class, new dateDeserializer());
super.registerModule(module);
}
public class dateDeserializer extends JsonDeserializer<DateTime> {
@Override
public DateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken t = jp.getCurrentToken();
String str = jp.getText().trim();
if (str.length() == 0) {
return null;
}
else {
DateTimeFormatter formatter = ISODateTimeFormat.dateTime().withOffsetParsed();
return formatter.parseDateTime(str);
}
}
}
}
然后用其余模板注册这个
private MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(new CustomObjectMapper());
return converter;
}
restTemplate.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());
如果有人对此有任何改进或想法,我们很乐意听取他们的意见。
谢谢,
肯尼
我将以下 JSON 字符串转换为 Joda DateTime 对象(使用 Jackson)
"2015-08-02T11:30:00.000+01:00"
使用以下代码打印时间
DateTimeFormatter timeFmt = DateTimeFormat.forPattern("HH:mm");
String timePart = timeFmt.print(dt);
我得到:
10:30
哪个是正确的 UTC 时间。
不过我希望能够打印出原来的当地时间
11:30
如何从我的日期时间对象中获取这个(甚至 +01:00 的原始偏移量)?
谢谢,
肯尼
好的,我终于找到了解决办法。它不是最优雅的,我宁愿在应用程序中注册自定义对象映射器 context.xml 但无法正常工作..
无论如何,我在反序列化期间恢复 UTC 的原因是 Jackson 提供的 DateTime 反序列化器有意这样做:
public ReadableInstant deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
JsonToken t = jp.getCurrentToken();
if(t == JsonToken.VALUE_NUMBER_INT)
return new DateTime(jp.getLongValue(), DateTimeZone.UTC);
if(t == JsonToken.VALUE_STRING)
{
String str = jp.getText().trim();
if(str.length() == 0)
return null;
else
return new DateTime(str, DateTimeZone.UTC);
} else
{
throw ctxt.mappingException(getValueClass());
}
}
所以我创建了一个自定义对象映射器
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
SimpleModule module = new SimpleModule("DateTime", Version.unknownVersion());
module.addDeserializer(DateTime.class, new dateDeserializer());
super.registerModule(module);
}
public class dateDeserializer extends JsonDeserializer<DateTime> {
@Override
public DateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken t = jp.getCurrentToken();
String str = jp.getText().trim();
if (str.length() == 0) {
return null;
}
else {
DateTimeFormatter formatter = ISODateTimeFormat.dateTime().withOffsetParsed();
return formatter.parseDateTime(str);
}
}
}
}
然后用其余模板注册这个
private MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(new CustomObjectMapper());
return converter;
}
restTemplate.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());
如果有人对此有任何改进或想法,我们很乐意听取他们的意见。
谢谢,
肯尼