Как сопоставление дат выполняется через Джексона в приложении Spring Boot

В контроллере остановки загрузки Spring, как отображается поле даты. Допустим, мы отправляем json {"receivedDate":"2024-05-15","num1":5}. Как оно будет сопоставлено с полем в объекте Java, имеющим частное свойство Дата получения даты; (при условии, что java.util.Date)

мы можем рассмотреть простой класс

public class SampleClass {
        Integer num1;
        Date receivedDate;
        //getters and setters
    }

и Rest Controller в приложении Spring Boot,

public ResponseEntity getDetails(@RequestBody SampleClass sampleClass) {
     try {
        System.out.println("Execution of getDetails started. received date is: "+sampleClass.getReceivedDate());
...............}
....
}

Я получаю результат в своей консоли как (я выполнил этот API в 10:20 утра по восточному стандартному времени):

Execution of getDetails started. received date is: Thu May 16 05:30:00 IST 2024

Итак, результат содержит 05:30:00, а не мое настоящее время. Что, если бы я хотел, чтобы это было просто 00:00:00.0 вместо 05:30:00.0. Я в замешательстве, потому что в некоторых ответах на stackoverflow я узнал, что поведение Джексона по умолчанию — действовать в соответствии с UTC. Но он работает согласно IST, хотя у меня нет настроек.

Всегда лучше работать со временем UTC, поскольку, например, на стороне Frontend можно изменить/обновить локальную дату на основе локальной даты. Это считается лучшей практикой в ​​​​мире разработки корпоративного программного обеспечения.

Jonathan JOhx 16.05.2024 07:53

Если можете, попробуйте временную метку (Long), которая намного меньше и отлично подходит как для сетевой передачи, так и для хранения базы данных.

HuaJFrame 16.05.2024 09:41

Привет @JonathanJOhx, я тоже хочу перейти на UTC, но по умолчанию у меня используется IST. Я создал очень простое приложение Spring Boot 3 и получил такое время. хотя я хотел, чтобы это было UTC.

Alok Kumar 16.05.2024 09:48

Для контекста, это дополнительный вопрос к как осуществляется форматирование времени в приложении Java 8 vs 17.

Anonymous 16.05.2024 21:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы хотите получать только год, месяц и день, а значение часов, минут и секунд по умолчанию — 00:00:00. Вы можете использовать аннотации @JsonFormat:

public class SampleClass {
    Integer num1;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    Date receivedDate;
}

Это установит время по умолчанию в вашем выводе на 00:00:00.

Execution of getDetails started. received date is: Wed May 15 00:00:00 CST 2024

Это сделает дату полностью и совершенно неправильной. В лучшем случае форматирование будет отображаться правильно в вашем часовом поясе на локальном компьютере.

Chaosfire 16.05.2024 09:29
Ответ принят как подходящий

Джексон преобразует правильно, основная проблема заключается в том, что вы используете устаревший, устаревший класс, известный своими проблемами, которые он вызывает.

Об этом спрашивали бесчисленное количество раз в разных формах. Не используйте java.util.Date, на самом деле это не дата, это момент, начиная с эпохи, класс не работает, вводит в заблуждение, вызывает множество ошибок программиста, API устарел по какой-то причине.

Кроме того, toString(), который вы неявно используете при печати, автоматически применяет часовой пояс по умолчанию при форматировании вывода, что добавляет путаницы. На самом деле ваш формат представляет собой простую дату без компонента времени, вместо этого используйте java.time.LocalDate , часть java.time, современного API даты и времени Java, доступного начиная с Java 8.

@Data
public class SampleClass {
  
  private Integer num1;
  private LocalDate receivedDate;
}

Если вам нужно соответствовать другому API, для которого требуется java.util.Date, есть удобные способы правильно выполнить преобразование.

Instant instantStartOfDay = sampleClass.getReceivedDate()
  .atStartOfDay()
  .toInstant(ZoneOffset.UTC);
Date asDate = Date.from(instantStartOfDay);

Здравствуйте, мне нужно установить дату в другом API, как вEntityManager.createQuery(sql, Object[].class) ..setParameter("endDate", Wrapper.getReceivedDate(), TemporalType.TIMESTAMP); Это принимает дату, а не LocalDate. Помогите, пожалуйста, любым удобным способом.

Alok Kumar 16.05.2024 10:07

@AlokKumar, тебе все равно следует сохранять предложенный LocalDate как можно дольше, а затем конвертировать его, как только он понадобится для твоего запроса.

daniu 16.05.2024 10:15

@AlokKumar В конце ответа есть пример. Но имейте в виду, что современные драйверы поддерживают преобразование классов java.time в типы даты и времени базы данных.

Chaosfire 16.05.2024 10:22

@AlokKumar Вы используете Hibernate? Какая версия? А какая марка базы данных и какой тип данных в базе? Без контекста я не могу оценить ваше утверждение, что нужен старомодный Date, но отношусь скептически: это должно работать со всеми современными типами из java.time.

Anonymous 17.05.2024 05:59

Нет необходимости конвертировать в java.util.Date. Hibernate уже поддерживает классы java.time, и вам следует передавать их непосредственно в Hibernate, а не конвертировать в java.util.Date. Просто полностью прекратите использовать java.util.Date. @АлокКумар

k314159 17.05.2024 11:52

Другие вопросы по теме