Estoy utilizando Spring MVC en una máquina que tiene configurado el horario de verano (América/Sao_Paulo zona horaria). En mi clase de formulario He utilizado el DateTimeFormat anotación para configurar la salida de mi Fecha:Spring @DateTimeFormat error de conversión con horario de verano
public class JustificativaOcorForm {
...
@NotNull
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dataMarcacao;
...
}
Mientras se depura Me estoy poniendo la fecha 16/10/2011 (dd/mm/aaaa), que es el comienzo de la luz del día tiempo, pero Spring lo convierte en 2011-10-15. ¿Por qué?
2011-11-04 16:35:31,965 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converting value Sun Oct 16 00:00:00 BRST 2011 of [TypeDescriptor @javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.util.Date] to [TypeDescriptor java.lang.Long]
2011-11-04 16:35:31,965 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converted to 1318730400000
2011-11-04 16:35:32,010 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converted to '2011-10-15'
veo esta pregunta: @DateTimeFormat in Spring produces off-by-one day error
pero Spring 3 utiliza Joda-Time y tengo joda-tiempo-2.0.jar en mi ruta de clase, así que no sé por qué ocurre esto y cómo puedo resuélvelo.
[EDIT]
He probado la creación de objetos LocalData, y encontré algo:
LocalDate ld = new LocalDate(new SimpleDateFormat("dd/MM/yyyy").parse("16/10/2011").getTime());
System.out.println(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss Z z").format(ld.toDate()) );
//prints 15/10/2011 00:00:00 -0200 BRST
LocalDate ld2 = new LocalDate(2011,10,16);
System.out.println(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss Z z").format(ld2.toDate()) );
//prints 16/10/2011 00:00:00 -0200 BRST
Parece que el primer enfoque es pensar que el tiempo está en UTC, debido a que la depuración Puede ver que Joda usa el método convertUTCToLocal de la clase DateTimeZone.
Tal vez este es el valor predeterminado de la primavera también, él espera una fecha en UTC también y estoy pasando la fecha de BRT.
Así que creo que mi solución es cambiar los objetos a LocalDate y usar la segunda forma de crear la instancia de este objeto.
No está claro, ¿está convirtiendo * en * una cadena, o * de * una cadena? Además, si esto solo pretende ser una fecha, sería mejor usar el tipo 'LocalDate' de Joda. –
@JonSkeet es una fecha para cadena. Puedo establecer LocalDate con @DateTimeFormat? –
Ciertamente lo esperaría. Tenga en cuenta que su valor de 'Fecha' parece ser medianoche * BRST * el 16 de octubre ... ¿es deliberado? Es cierto que es extraño que se formatee como el 15 de octubre ... pero sería mejor evitar las zonas horarias por completo si está usando fechas :) –