Я использую Spring MVC на машине, на которой настроено летнее время (часовой пояс America / Sao_Paulo). В моем классе формы я использовал аннотацию DateTimeFormat для настройки вывода моей Date:
public class JustificativaOcorForm {
...
@NotNull
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dataMarcacao;
...
}
Во время отладки я получаю дату 16/10/2011 (дд / ММ / гггг), это начало летнего времени, но весна преобразует его в 2011-10-15. Почему?
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'
Я вижу такой вопрос: @DateTimeFormat в Spring выдает ошибку с интервалом в один день
, но Spring 3 использует Joda-Time, и у меня в пути к классам есть joda-time-2.0.jar, поэтому я не знаю, почему это происходит и как я могу это решить.
[РЕДАКТИРОВАТЬ]
Я тестировал создание объектов LocalData и кое-что нашел:
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
Похоже, что первый подход предполагает, что время указано в формате UTC, поскольку при отладке я вижу, что Joda использует метод convertUTCToLocal класса DateTimeZone.
Может быть, это тоже значение по умолчанию для Весны, он тоже ожидает одну дату в UTC, а я передаю дату BRT.
Итак, я думаю, что мое решение - изменить объекты на LocalDate и использовать второй способ создания экземпляра этого объекта.