В контроллере остановки загрузки 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, хотя у меня нет настроек.
Если можете, попробуйте временную метку (Long), которая намного меньше и отлично подходит как для сетевой передачи, так и для хранения базы данных.
Привет @JonathanJOhx, я тоже хочу перейти на UTC, но по умолчанию у меня используется IST. Я создал очень простое приложение Spring Boot 3 и получил такое время. хотя я хотел, чтобы это было UTC.
Для контекста, это дополнительный вопрос к как осуществляется форматирование времени в приложении Java 8 vs 17.
Вы хотите получать только год, месяц и день, а значение часов, минут и секунд по умолчанию — 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
Это сделает дату полностью и совершенно неправильной. В лучшем случае форматирование будет отображаться правильно в вашем часовом поясе на локальном компьютере.
Джексон преобразует правильно, основная проблема заключается в том, что вы используете устаревший, устаревший класс, известный своими проблемами, которые он вызывает.
Об этом спрашивали бесчисленное количество раз в разных формах. Не используйте 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. Помогите, пожалуйста, любым удобным способом.
@AlokKumar, тебе все равно следует сохранять предложенный LocalDate
как можно дольше, а затем конвертировать его, как только он понадобится для твоего запроса.
@AlokKumar В конце ответа есть пример. Но имейте в виду, что современные драйверы поддерживают преобразование классов java.time
в типы даты и времени базы данных.
@AlokKumar Вы используете Hibernate? Какая версия? А какая марка базы данных и какой тип данных в базе? Без контекста я не могу оценить ваше утверждение, что нужен старомодный Date
, но отношусь скептически: это должно работать со всеми современными типами из java.time.
Нет необходимости конвертировать в java.util.Date. Hibernate уже поддерживает классы java.time, и вам следует передавать их непосредственно в Hibernate, а не конвертировать в java.util.Date. Просто полностью прекратите использовать java.util.Date. @АлокКумар
Всегда лучше работать со временем UTC, поскольку, например, на стороне Frontend можно изменить/обновить локальную дату на основе локальной даты. Это считается лучшей практикой в мире разработки корпоративного программного обеспечения.