java.time
Ответ Джона Скита правильный. Как он упомянул, вы должны использовать классы java.time , определенные в JSR 310. Эти современные классы много лет назад вытеснили ужасные классы даты и времени, такие как Date
и SimpleDateFormat
. Вот пример кода в этом направлении.
дата Varchar в таблице 29.03.2009 23:23:03 // мы хотим, чтобы эта дата была в ET
Разобрать строку как LocalDateTime
, потому что в нашем вводе отсутствует индикатор смещения от UTC или часового пояса.
Определить шаблон форматирования, соответствующий вводу.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss" ) ;
Анализировать.
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
Если вы абсолютно уверены , эта дата и время были предназначены для определенного часового пояса, примените ZoneId
, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
Настройте UTC, извлекая Instant
.
Instant instant = zdt.toInstant() ;
Ваш драйвер JDBC может не принять Instant
. Поэтому преобразуйте в OffsetDateTime
, где смещение установлено равным нулю часов-минут-секунд (другими словами, сам UTC).
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
Запись в столбец типа TIMESTAMP WITH TIME ZONE
в вашей базе данных. Начиная с JDBC 4.2 и более поздних версий, мы можем напрямую обмениваться объектами java.time с базой данных.
myPreparedStatement.setObject( … , odt ) ;
И поиск.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Настройте желаемый часовой пояс.
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
Теперь у вас есть части, необходимые для некоторого рефакторинга базы данных , чтобы заменить этот столбец varchar на правильный столбец TIMESTAMP WITH TIME ZONE
.