@DateTimeFormat весной возвращает предыдущий день

#java #spring #spring-boot #date #datetime

Вопрос:

У меня есть метод, у которого есть параметр с аннотацией @DateTimeFormat.

 public static void exampleMethod(@ApiParam(value = "date", required = true)
                                 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date) {...}
 

Когда он получает «2021-10-12», переменная даты по какой-то причине содержит «Пн 11 октября 23:00:00 МСК 2021». В моем запросе нет времени, но я получаю предыдущую дату и всегда 23:00:00.

Мне действительно нужно использовать Date тип данных здесь, так что можно сделать, чтобы решить эту проблему?

Заранее спасибо.

Комментарии:

1. Я бы не стал пересекать посылки. Используйте более старый SimpleDateFormat для форматирования java.util. Дата вместо более новой версии java.time. Формат даты и времени.

2. Это из-за часового пояса. Ваша переменная даты имеет MSK часовой пояс и выглядит так, как будто вы находитесь в часовом поясе MSK.

3. @duffymo, Но можно ли это сделать в параметрах метода, как в моем примере?

4. 2021-10-12 (или 2021-10-12T00:00 ) в UTC должно быть Mon Oct 12 03:00:00 MSK 2021 , потому что MSK-это GMT 3. Трудно сказать что-либо помимо этого, не заглядывая в полный код. Что касается времени, отображаемого в строке : java.util.Date не сохраняет часовой пояс или формат; это просто оболочка вокруг количества миллисекунд. Любое значение, которое вы видите, — это просто строка, отформатированная как EEE MMM dd HH:mm:ss zzz yyyy часовой пояс по умолчанию и использующая его.

Ответ №1:

Если кто-нибудь когда-нибудь столкнется с этой проблемой, мне удалось решить ее с помощью java.sql.Date (поскольку это подкласс java.util.Date ) и @JsonFormat аннотации одновременно:

 public static void exampleMethod(@ApiParam(value = "date", required = true)
                                 @JsonFormat(pattern="yyyy-MM-dd") Date date) {...}