Как можно вставить временную метку с часовым поясом в postgresql с помощью подготовленного оператора?

Я пытаюсь вставить в метку времени с полем часового пояса моего БД строку, которая включает дату, время и часовой пояс, используя подготовленный оператор.

Проблема заключается в том, что функция Timestamp.valueof не учитывает часовой пояс, в который строка включается, поэтому она вызывает ошибку. Принимаемый формат - yyyy- [m] m- [d] d hh: mm: ss [.f...], который не упоминает часовой пояс.

Это точный код, который вызывает ошибку:

pst.setTimestamp(2, Timestamp.valueOf( "2012-08-24 14:00:00 +02: 00" ))

Есть ли способ, которым я могу его преодолеть? Спасибо заранее!

Ответ 1

Основная проблема заключается в том, что java.sql.Timestamp не содержит информацию о часовом поясе. Я думаю, что это всегда считается "местным часовым поясом".

В решении, которое я могу думать о том, чтобы не использовать параметр в PreparedStatement, но литерал временной шкалы в SQL:

update foo
  set ts_col = timestamp with time zone '2012-08-24 14:00:00 +02:00'`;

Другим возможным решением может быть передача правильно отформатированной строки в PrepareStatement, которая использует to_timestamp():

String sql = "update foo set ts_col = to_timestamp(?, 'yyyy-mm-dd hh24:mi:ss')"; 
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "2012-08-24 14:00:00 +02:00");

Ответ 2

Я считаю, что вы могли бы использовать еще одно поле в своей базе данных, которое будет включать часовой пояс. И вычислите время вручную после того, как вы получите эти два поля