ТЛ; др
myPreparedStatement.setObject(
… ,
OffsetDateTime.parse( "2006-02-16T21:36:32.000+0000" )
)
С и без зоны / смещение
Вы сказали, что ваш столбец имеет тип TIMESTAMP
, что сокращенно от TIMESTAMP WITHOUT TIME ZONE
. Этот тип преднамеренно лишен какой-либо концепции часового пояса или смещения от UTC. Не обычно подходит для общих деловых целей.
Вы используете неправильный тип
Это неправильный тип * 1014 для вашего ввода . Ваш вход имеет смещение от UTC, равное нулю часов, что означает само UTC. Имея смещение или зону, ваши данные должны храниться только в столбце типа TIMESTAMP WITH TIME ZONE
. В этом типе …WITH…
в Postgres любая отправленная информация о смещении / зоне используется для настройки в UTC для хранения, а затем отбрасывается.
Хранение значения даты-времени со смещением или зоной в столбце типа TIMESTAMP WITHOUT TIME ZONE
аналогично сохранению цены / стоимости с указанной валютой (доллары США, евро, рубли и т. Д.) В столбце числового типа. Вы теряете важные данные, валюту. Это делает ваши данные бесполезными.
См. Страницу документации Postgres для этих типов.
Умные объекты, а не тупые нити
По возможности, используйте объекты для обмена данными с вашей базой данных, а не для передачи строк метра. Пусть ваш драйвер JDBC выполнит свою работу в маршалинге данных туда-сюда.
Анализировать входную строку как объект OffsetDateTime
.
ISO 8601
Ваши входные строки имеют формат, определенный стандартом ISO 8601 . Классы java.time по умолчанию используют форматы ISO 8601 при разборе / генерации строк. Не нужно указывать шаблон форматирования.
String input = "2006-02-16T21:36:32.000+0000" ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
Определите ваш SQL как подготовленный оператор.
В JDBC 4.2 и более поздних версиях вы можете напрямую обмениваться объектами java.time с вашей базой данных. Больше не нужно использовать проблемные классы, такие как java.sql.Timestamp
.
Вы можете передать OffsetDateTime
. Мне нравится извлекать Instant
, чтобы продемонстрировать читателю, что я понимаю, как Postgres всегда хранит значение TIMESTAMP WITH TIME ZONE
в UTC.
Instant instant = odt.toInstant() ;
myPreparedStatement.setObject( … , instant ) ;
индексирование.
Instant instant = myResultSet.getObject( … , Instant.class ) ;