2015-02-17 2 views
0

У меня есть следующие JSON строка, которая преобразуется в объект Joda DateTime (Использование Jackson)Доступ оригинальный местного времени от объекта Joda DateTime

"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) с моей даты объект времени?

Спасибо,

Kenny

+1

Как преобразовать в DateTime? Можете ли вы добавить свой сериализатор к своему вопросу? – vtor

+0

Извините, что не вернусь к вам раньше, я был в отпуске. Я использую Spring restTemplate.exchange, который под капотом использует Jackson для десериализации. Я считаю, что мне нужно добавить настраиваемый объект mapper для Jackson для обработки dateTime, поскольку значение по умолчанию теряет локальную информацию о времени и просто преобразуется в UTC. Я еще не сделал этого, но попробую это сейчас и обновить, когда закончите. – km2000

ответ

0

Ok я, наконец, нашел решение. Это не самый элегантный, я бы скорее зарегистрировал настраиваемый объект mapper в application context.xml, но не смог получить эту работу.

В любом случае причина, по которой я получаю UTC во время десериализации, так это то, что 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()); 
     } 
    } 

Так что я создал Mapper пользовательских объектов

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()); 

Если кто имеет какие-либо улучшения или мысли по этому поводу хотелось бы услышать их.

Спасибо,

Kenny

Смежные вопросы