ТЛ; др
- Вас смущает неудачное поведение
Timestamp::toString
при применении текущего часового пояса JVM по умолчанию к внутреннему значению UTC объектов.
- ➡ Использовать
Instant
, никогда Timestamp
.
- Строка, такая как
2018-04-26T12:31Z
, имеет стандартный ISO 8601 формат, где Z
- это сокращение от Zulu
и означает UTC .
Весь ваш блок кода можно заменить на:
Instant.now()
… таких как:
myPreparedStatement.setObject( … , Instant.now() ) ;
Подробнее
Ответ от wowxts правильный. Instant
всегда в UTC, как и Timestamp
, но Timestamp::toString
применяет часовой пояс. Такое поведение является одним из многих неудачных вариантов дизайна в этих проблемных классах наследства.
Я добавлю несколько других мыслей.
Используйте Instant
для UTC
ZonedDateTime currentTimeUTC = ZonedDateTime.now (ZoneOffset.UTC);
Хотя это технически правильно, эта строка семантически неверна. Если вы хотите представить момент в UTC, используйте Instant
class. Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Избегайте наследства Timestamp
класс
* * Timestamp.from тысяча шестьдесят один (currentTimeUTC.toInstant ()); * * тысяча шестьдесят-две
Хотя технически правильно, используя мое предложение выше, это будет:
Timestamp.from( instant ); // Convert from modern *java.time* class to troublesome legacy date-time class using new method added to the old class.
Ничего не потеряно, если между Instant
и Timestamp
, поскольку оба представляют момент в UTC с разрешением наносекунд. Однако ...
Нет необходимости использовать java.sql.Timestamp
! Этот класс является частью проблемных старых классов даты и времени, которые теперь унаследованы. Они были полностью вытеснены java.time классами, определенными JSR 310. Timestamp
заменяется на Instant
.
JDBC 4.2
Начиная с JDBC 4.2 и более поздних версий, вы можете напрямую обмениваться java.time объектами с вашей базой данных.
Insert / Update.
myPreparedStatement.setObject( … , instant ) ;
индексирование.
Instant instant = myResultSet.getObject( … , Instant.class ) ;
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на java.time классы.
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
The ThreeTen-Extra Проект расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .