Конвертировать строку в Postgres Timestamp и обратно - PullRequest
0 голосов
/ 04 мая 2018

Часть 1:

У меня есть файл, который содержит дату в виде строки в следующем формате: 2006-02-16T21:36:32.000+0000

Мне нужно записать это значение в Postgres в столбце типа Timestamp. Как мне сделать это в Java?

Часть 2:

Мне нужно прочитать значение, сохраненное в части 1 из Postgres, и преобразовать его в строку следующего формата "2006-02-16T21:36:32.000+0000"


Вот что я пробовал:

Timestamp lastSyncDate = Timestamp.valueOf(2006-02-16T21:36:32.000+0000)

Когда я пытаюсь записать его в postgres, выдается следующая ошибка:

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

ТЛ; др

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 ) ;
0 голосов
/ 04 мая 2018

2006-02-16T21:36:32.000+0000 выглядит как отметка времени ISO-8601. Postgres понимает этот формат. просто относитесь к нему как к любой другой строке.

не пытайтесь преобразовать его в метку времени Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...