Учитывая эту таблицу:
CREATE TABLE a(
t TIMESTAMP WITH TIME ZONE
);
И этот простой фрагмент кода JDBC:
DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/dbname", "user", "password"
).use { connection ->
val nowSomeTimeZone = OffsetDateTime.now(ZoneOffset.of("+4"))
connection.prepareStatement("insert into a(t) values (?)").use { insertStmt ->
insertStmt.setObject(1, nowSomeTimeZone)
insertStmt.executeUpdate()
}
connection.createStatement().use { stmt ->
stmt.executeQuery("select * from a").use { resultSet ->
resultSet.next()
val t = resultSet.getObject(1, OffsetDateTime::class.java)
println("$nowSomeTimeZone -> $t")
}
}
}
Где-то внутри стека JDBC должно происходить автоматическое преобразование из +04: 00 в UTC, потому что это вывод println
:
2018-08-30T10:35:33.594+04:00 -> 2018-08-30T06:35:33.594Z
Что еще более странно, когда я смотрю в таблицу с помощью консольного клиента psql
, она показывает мне метку времени в еще одном часовом поясе (который является моим локальным часовым поясом):
$ psql -h localhost -U username
dbname=> select * from a;
t
----------------------------
2018-08-30 08:35:33.594+02
Почему происходит это преобразование и как его отключить?