我无法找到一种方法来读取时区时间戳的PostgreSQL列中的时区值。
JDBC提供方法 java.sql.ResultSet #getTimestamp(int,java.util.Calendar) 但我必须提供自己的日历。我看不到从正在阅读的时间戳字段中获取该日历。
我正在研究存储多个时区的时间数据的系统。我需要使用时区信息保存数据,并能够从数据库中读回该时区。
是否可以不用像
那样的黑客攻击我正在使用JDBC 41(JDBC4 Postgresql驱动程序,版本9.4-1201),java 8.
答案 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设置,如果未设置则设置为服务器时区)。它不是保存字段时使用的偏移量。