【问题标题】:Query time column from postgresql using jdbc使用 jdbc 从 postgresql 查询时间列
【发布时间】:2017-12-13 18:08:41
【问题描述】:

我用的是PostgreSQL 8.4,服务器是linux,linux的时区is'EDT'不是'UTC'。 PostgreSQL 的配置使数据库的时区为'UTC'。代码在 JBoss9 上运行。

我有一个 sql,select to_char(ts_entry.submitted_date, 'MM/DD/YYYY HH24:MM') as submitted_date_format from ts_entry where ....

如果我们在 PostgreSQL 中运行 sql,我们将得到值“07/10/2017 02:07

但是当我尝试在java中从resultSet获取值时,

Statement st = connection.createStatement(); 
ResultSet rs = st.executeQuery(sql); 
String value = rs.getString("submitted_date_format");

值为“07/09/2017 22:07”。 DB中的原始值为“2017-07-10 02:02:25.268+00”。

linux服务器时区在代码层面造成的影响如何处理?

顺便说一句,我知道另一种解决方案,更改 jboss 的启动脚本,以使 jboss 使用时区“UTC”启动。这个问题可以在代码层面处理吗?

【问题讨论】:

  • java 的 LocalDateTime 应该能够做到这一点
  • 但是resultSet中的值类型是'String'
  • 如果数据库列是日期/日期时间,那么它将在结果集中有日期或时间戳之类的东西
  • 抱歉没提,DB中的列类型是时间戳,但我想获取格式化的日期,而不是原始值。并且格式化的日期是'String',原始值是'timestamp'
  • 取原始值,转换成java.util.Date,然后调用d.setHours(d.getHours()-4);,然后解析成字符串

标签: java postgresql jdbc timezone timestamp-with-timezone


【解决方案1】:

数据库服务器机器的时区对行为没有直接影响,除了它用于在postgresql.conf中初始化timezone,这是客户端时区的初始设置,除非被数据库会话覆盖。

PostgreSQL 在内部以 UTC 存储timestamp with time zone,并在交付时将其转换为客户端的本地时区。

所以你应该按照你需要的方式设置数据库会话时区

SET TIME ZONE '<time zone name>';

当您从 PostgreSQL 中选择时,这会将日期转换为该时区。

【讨论】:

  • 是的,你说的很有道理。但是如果 2 个客户端使用同一个服务器,那么两者都会检索相同的数据。所以我需要将相同的数据转换到不同的时区,我可以得到不同客户端的时区,但是linux服务器的时区会破坏所有这些。
  • 默认 Java 时区由客户端操作系统时区设置,但没有什么可以阻止您在代码中明确使用不同的时区。
  • 我使用 IntelliJ 调试代码,远程连接到 linux 服务器。并且字符串值是错误的"07/09/2017 22:07" BTW,我的开发环境的时区是-8小时,linux服务器的时区是-4小时,字符串值是-4小时到原始值,所以我的开发环境似乎对值没有影响。
  • 我进行了更多调查并更改了答案。这有帮助吗?
  • 非常感谢。这是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多