2017-01-27 2 views
3

У меня есть запросParam, который принимает дату (т.е. 2017-01-24T06: 00: 00.000Z).Spring @DateTimeFormat создает объект Date с предыдущим днем ​​

Я использую DateTimeFormat, чтобы отформатировать его в дату, чтобы перейти в мой контроллер.

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date myDate 

, но когда я печатаю MyDate к моей консоли я получаю «Пн янв 23, 18:00:00 CST 2017», но в моем примере выше это должно быть 24 января. Почему он меняет дату на 1 день?

ответ

2

Здесь есть несколько вещей.

Во-первых, весна @DateTimeFormat, при аннотации поля или параметра java.util.Date, uses a SimpleDateFormat with its timezone set to UTC.

Во-вторых, вы использовали DateTimeFormat.ISO.DATE, который представляет

Наиболее распространенный формат ISO Дата yyyy-MM-dd, например, "2000-10-31".

Другими словами, он не учитывает информацию о часовом поясе в вашей строке даты (это не имеет большого значения, потому что ваша строка даты была внедрена в Zulu в любом случае).

В-третьих, вы указали строку даты, где все, кроме шаблона iso, игнорируются. SimpleDateFormat только заботится о части 2017-01-24.

Поскольку часовой пояс установлен на UTC, он считает, что дата 2017-01-24 коренится в UTC, в полночь, в ноль, часы, минуты и секунды.

Наконец, поскольку часовой пояс вашей системы по умолчанию - это стандартное центральное время, т.е. UTC-6), когда вы вызываете toString на объект Date, он вернет String, который отформатирован с этим часовым поясом, т.е. 6 часов до полуночи.


Помните также, что Date не имеет ни малейшего понятия о временной зоны. Это временная метка.


Чтобы «исправить» это, построить ваш @DateTimeFormat с соответствующим pattern, интерпретирующей время и часовой пояс. Я бы использовал

@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX") Date myDate 
Смежные вопросы