5

我无法找到一种方法来读取时间戳类型的 PostgreSQL 列中的时区值与 time zone

JDBC 提供方法java.sql.ResultSet#getTimestamp(int, java.util.Calendar) 但我必须提供自己的日历。我看不到从我正在阅读的时间戳字段中获取该日历的方法。

我正在研究存储多个时区的时间数据的系统。我需要使用时区信息保存数据,并能够从数据库中读取该时区。

没有像这样的黑客有可能吗

  • 将时区值存储在另一个字段中
  • 将日期存储为字符串,例如 'Wed 17 Dec 07:37:16 1997 PST'

我正在使用 JDBC 41(JDBC4 Postgresql 驱动程序,版本 9.4-1201),java 8。

4

2 回答 2

7

这里的 PostgreSQL 文档说:

对于timestamp with time zone,内部存储的值始终采用 UTC(通用协调时间,传统上称为格林威治标准时间,GMT)。

所以没有必要“存储时区[对应于时间戳值]”本身;这些timestamp with time zone值始终存储为 UTC。

此外,无需“从时间戳字段获取日历”。日历的目的是让您定义要在 Java 应用程序中使用的特定时

换句话说,timestamp with timezone它不存储来自不同时区的值(例如,一些在 EST,另一些在 PST 等),它在插入时间戳值时将所有内容转换为 UTC。

于 2015-06-11T18:32:29.687 回答
4

接受的答案是真实准确的。time 类型的 timestamp字段中不存储时区信息,无法提取。

如果对时间戳的时区感兴趣,则必须单独存储(在其他字段中,或在自定义列类型中)。

乍一看,似乎可以使用函数extract(timezone from field)从带时区的时间戳中提取时区,但事实并非如此。

该函数仅给出“与 UTC 的时区偏移,以秒为单位”。重要(文档中未说明)部分是偏移量是从当前时区测量的(由会话 SET SESSION TIME ZONE 设置,如果未设置,则由服务器时区设置)。保存字段时使用的不是偏移量。

于 2015-06-11T19:44:11.480 回答