¿Cómo deserializar la fecha de JS usando Jackson?

Obtengo una cadena de fecha de ExtJS en el formato:

“2011-04-08T09: 00: 00”

cuando bash deserializar esta fecha, cambia la zona horaria a Indian Standard Time (agrega +5: 30 a la hora). Así es como estoy deserializando la fecha:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat); 

Hacer esto tampoco cambia la zona horaria. Todavía tengo la fecha en IST:

 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat); 

¿Cómo deserializo la fecha en la forma en que está llegando sin las molestias de Timezone?

Encontré un trabajo alternativo, pero con esto tendré que anotar el setter de cada fecha a lo largo del proyecto. ¿Hay alguna manera de especificar el formato al crear ObjectMapper?

Esto es lo que hice:

 public class CustomJsonDateDeserializer extends JsonDeserializer { @Override public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); String date = jsonParser.getText(); try { return format.parse(date); } catch (ParseException e) { throw new RuntimeException(e); } } } 

Y anotaron el método setter de cada campo de fecha con esto:

 @JsonDeserialize(using = CustomJsonDateDeserializer.class) 

Esto funciona para mí, estoy usando jackson 2.0.4

 ObjectMapper objectMapper = new ObjectMapper(); final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); objectMapper.setDateFormat(df); 

Además de la respuesta de Varun Achar , esta es la variante de Java 8 que se me ocurrió, que usa java.time.LocalDate y ZonedDateTime en lugar de las antiguas clases de java.util.Date.

 public class LocalDateDeserializer extends JsonDeserializer { @Override public LocalDate deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException { String string = jsonparser.getText(); if(string.length() > 20) { ZonedDateTime zonedDateTime = ZonedDateTime.parse(string); return zonedDateTime.toLocalDate(); } return LocalDate.parse(string); } } 

Hay un buen blog sobre este tema: http://www.baeldung.com/jackson-serialize-dates Use @JsonFormat se ve de la manera más simple.

 public class Event { public String name; @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss") public Date eventDate; } 

@JsonFormat solo funciona para el formato estándar compatible con la versión de jackson que está utilizando.

Ej .: compatible con cualquiera de las formas estándar (“aaaa-MM-dd’T’HH: mm: ss.SSSZ”, “aaaa-MM-dd’T’HH: mm: ss.SSS’Z ‘”, ” EEE, dd MMM aaaa HH: mm: ss zzz “,” aaaa-MM-dd “)) para jackson 2.8.6