Здесь есть несколько вещей.
Во-первых, весна @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