Потерял один день на день

На стороне клиента я использую формат даты dd/MM/yyyy. В поле используется твиттер-бутстрап 3 сборщика времени (https://eonasdan.github.io/bootstrap-datetimepicker/)

Я вхожу через twitter bootstrap 3 сборщик datetime 24/07/2015
в моем json я послал, я вижу: дата рождения: "24/07/2015"

В моем dto, я делаю

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;

Когда я получаю дату на сервере, в моем dto см.: 23/07/2015 19:00

Один день потерян.

Любая экспликация?

Ответ 1

Согласно странице JacksonFAQDateHandling:

Все объекты времени, связанные с TimeZone (java.util.Calendar и т.д.), Которые построены Jackson, используют стандартный часовой пояс (GMT), а не локальный часовой пояс (независимо от того, что может быть). То есть: Джексон по умолчанию использует GMT для всей обработки, если специально не указано иное.

В вашем случае, похоже, дата автоматически преобразуется в GMT/UTC. Попытайтесь явно указать свой часовой пояс, чтобы избежать конверсии UTC [как указано в вопросе. Как это время отключилось на 9 часов? (5 часов, 3 часа и т.д.) На той же странице]:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST")

Во-вторых, я думаю, что вы используете Date.toString() для печати даты. Обратите внимание, что класс java Date зависит от часового пояса, но его метод toString() использует системный часовой пояс перед печатью.

Здесь это выглядит как 24/07/2015 00:00 UTC преобразуется в 23/07/2015 19:00 EST by toString(). Оба они представляют один и тот же момент времени, но в разных часовых поясах.

Ответ 2

Ответ AimZ - это то, что указывало мне на это, но я добавил эти три строки в файл application.properties и достиг того же самого

spring.jackson.date-формат = YYYY-MM-дд

spring.jackson.serialization.write-дат-как-временные метки: ложь

spring.jackson.time-зона: EST