Ошибка преобразования Spring @DateTimeFormat с переходом на летнее время

Я использую 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 и использовать второй способ создания экземпляра этого объекта.

5
задан Cœur 20 August 2017 в 01:28
поделиться