如何从“带时区的时间戳”列中读取时区?

时间:2015-06-11 15:51:48

标签: java postgresql jdbc timestamp-with-timezone

我无法找到一种方法来读取时区时间戳的PostgreSQL列中的时区值。

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.

2 个答案:

答案 0 :(得分:7)

PostgreSQL文档here说:

  

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

因此,无需“存储时区[对应于时间戳值]”本身; timestamp with time zone值始终存储为UTC。

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

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

答案 1 :(得分:4)

接受的答案是真实准确的。 带时间的时间戳类型不会在字段中存储时区信息,也无法将其提取出来。

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

乍一看,似乎可以使用函数 extract(来自字段的时区)带时区的时间戳中提取时区,但事实并非如此。< / p>

该功能仅提供'UTC的时区偏移,以秒为单位测量'。重要(并且未在文档中说明)部分是偏移量是从当前时区测量的(由会话SET SESSION TIME ZONE设置,如果未设置则设置为服务器时区)。它不是保存字段时使用的偏移量。