java - 显示时区 SQL 命令的 JDBC 替代方法

标签 java postgresql jdbc timezone

继我之前的问题之后:

show timezone - difference between pgAdmin and JDBC results

我可以通过 pgAdmin 连接到任何时区的 PostgreSQL 服务器,并通过以下方式让它返回其时区:

show timezone;

但是,如果我使用 JDBC 并进行相同的调用,它不会按预期返回外部服务器的时区文本。它返回我的客户端机器的时区,这不是我预期的行为。我期待与 pgAdmin 相同的行为,它将外部服务器的时区作为文本返回。

我理解为什么 JDBC 会使用我的客户端时区进行日期时间操作。这完全有道理,但是当向外部服务器询问其时区时,它返回我的客户端时区是没有意义的。

我真的想通过 JDBC 获取外部服务器的时区,而无需事先知道该时区是什么,并且必须手动设置我的 JVM 的时区,因为这违背了我试图进行的调用的目的.

除了使用 show timezone 之外,还有其他方法吗?

最佳答案

PostgreSQL 中的时间始终以 UTC 格式存储, session 时区用于连接转换。此 session 配置可以在服务器上具有默认配置。

如果你真的需要知道它,使用

select * from pg_file_settings where name = 'timezone' 

这只有在明确配置时才会有值,否则默认为 GMT。

另见 8.5.3. Time Zones :

All timezone-aware dates and times are stored internally in UTC. They are converted to local time in the zone specified by the TimeZone configuration parameter before being displayed to the client.

此配置设置指定默认 session 时区,它实际上不是“服务器时区”);它的配置实际上并不影响 PostgreSQL 服务器通常如何处理日期。

连接库可以通过指定 TimeZone 连接属性或稍后执行 set time Zone '...' 来为 session 覆盖此设置。

所以这实际上并不特定于 PostgreSQL JDBC 驱动程序:它通常适用于 PostgreSQL,但 PostgreSQL JDBC 驱动程序总是这样做(请参阅 ConnectionFactoryImpl)以符合日期和时间需要的 JDBC 规范要求默认的 JVM 时区。

关于java - 显示时区 SQL 命令的 JDBC 替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46100763/

相关文章:

java - if 带有静态变量的 block

java - 在程序文件夹中创建锁定文件会导致异常

postgresql - 如何在 EXCLUDE 约束中将 uuid 与 postgresql 要点一起使用

java - minSdkVersion大于9时Android通信链路失败

java - 如何使用 Java 8 创建无限流

java - 如何指定可选的查询参数

sql - 获取 Postgres 中表的最后一条记录

ruby-on-rails - 如何将大量记录(4m+)迁移到 Heroku/Postgresql?

FUSEKI 的 MySQL 配置

java - 在准备好的声明中设置特定日期