Если это отметка времени для вашей базы данных SQL: не указывайте в вашей базе данных отметку времени в виде строки. Дайте ему надлежащий объект даты и времени. Начиная с JDB C 4.2 это означает:
- Для SQL
timestamp with time zone
(рекомендуется для подавляющего большинства целей) обеспечить OffsetDateTime
; многие водители также принимают Instant
. - Для SQL
timestamp
без часового пояса укажите LocalDateTime
.
Так, например:
java.sql.Date inputDate = getFromSomewhere();
OffsetDateTime dateTimeForDatabase = inputDate.toLocalDate()
.atStartOfDay(ZoneOffset.UTC)
.toOffsetDateTime();
System.out.println(dateTimeForDatabase);
PreparedStatement stmt = yourDatabaseConnection.prepareStatement(
"insert into your_table(your_timestamp_col) values (?)");
stmt.setObject(1, dateTimeForDatabase);
int rowsInserted = stmt.executeUpdate();
Пример вывода из оператора печати в середине:
2019-09-29T00: 00Z
Z
означает UT C, поэтому это тот же момент времени, что и 2019-09-28 20:00:00.0
, который вы запрашивали, при условии, что часовой пояс вашей JVM является некоторым вариантом североамериканского восточного времени (Америка / Торонто или Америка / Нью-Йорк).
Объект, который вы видите, в вашем отладчике очень похоже на java.sql.Date
объект, поэтому я взял этот тип в качестве отправной точки. Класс java.sql.Date
плохо спроектирован, хотя на самом деле это настоящий взлом на фоне уже плохо спроектированного класса java.util.Date
. Это также давно устарело. Поэтому, если бы вы могли вместо этого получить современный тип, например LocalDate
, это было бы выгодно.
Что пошло не так в вашем коде?
A LocalDate
- это дата без времени дня, например 2019-09-29. Вы пытались отформатировать один, используя шаблон формата yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
. Итак, вы просите включить в результат время суток, но, как я уже сказал, у LocalDate
нет времени суток, так что это не имеет смысла. Полученное сообщение об ошибке было довольно точным:
Неподдерживаемое поле: HourOfDay