我在安装了Postgresql的CentOS 6.x上运行系统:
PostgreSQL 9.0.11 on x86_64-unknown-linux-gnu,由GCC gcc (GCC) 4.1.2编译20080704(红帽 4.1.2-52),64 位
我现在面临的问题看起来像是:
PostgreSQL 配置:
\#timezone = 未知 # 实际上,默认为 TZ 环境
来自 psql 的会话配置:
select setting
from pg_settings
where name in ('TimeZone', 'timezone_abbreviations');
Israel
Default
----- 操作系统时区是以色列:zdump -v/etc/localtime |grep 2013/etc/localtime 星期四 3 月 28 日 23:59:59 UTC = 星期五 3 月 29 日 01:59:59 2013 IST isdst=0 gmtoff=7200/etc/localtime 2013 年 3 月 29 日星期五 00:00:00 UTC = 2013 年 3 月 29 日星期五 03:00:00 IDT isdst=1 gmtoff=10800/etc/localtime 星期六 10 月 26 日 22:59:59 UTC = 星期日 10 月 27 日 01:59:59 2013 IDT isdst=1 gmtoff=10800/etc/当地时间 2013 年 10 月 26 日星期六 23:00:00 UTC = 2013 年 10 月 27 日星期日 01:00:00 IST ISDST=0 gmtoff=7200----
现在 - 根据 zdump 从夏季时区的转换应该在 10 月 27 日星期日 01:00:00 完成。当我跑步时
select '2013-09-06 00:00:00'::timestamptz it shows date in +03 timezone - 2013-09-06 00:00:00+03
但是当我跑步时
select '2013-09-08 00:00:00'::timestamptz
它以 +02 时区显示日期 - 2013-09-06 00:00:00+02
但它应该以 +03 显示,因为时区偏移将仅在对于2013-09-06 00:00:00'::timestamptz
周日 10 月 27 日 01:00:00。
所以有两个问题:
- postgresql 如何保持时区偏移的日期以及如何检查当前值。
- 我该如何解决这个问题。
Postgres 源在/src/timezone/data 中包含 TZDB 的副本。 随着Postgres新版本的发布,它会定期更新。
根据修订历史,撰写本文时的最新版本是 2013d。 这确实是包含您正在寻找的以色列更改的版本。 请参阅 2013d 版本公告。 因此,如果您可以更新Postgres版本,则应看到所需的更改。
查看发布日期,似乎此数据应采用以下任何版本:
9.3.1
9.3
9.2.5
9.1.10
9.0.14
8.4.18
您说您运行的是 9.0.11,发布日期为 2012-12-06,因此您当前使用的是 TZDB 版本 2012j。 这解释了您描述的时间戳中的差异。 您应该将 Postgres 至少更新到版本 9.0.14。
但是由于你运行的是Linux系统,它有自己的tzdata副本,你可以采取不同的方法,告诉Postgres使用这些数据而不是它自己的。 在从源构建 postgres 时,您必须提供一个参数来configure
。
从此处的文档:
--with-system-tzdata=DIRECTORY
PostgreSQL包含自己的时区数据库,这是日期和时间操作所必需的。这个时区数据库实际上与许多操作系统(如FreeBSD,Linux和Solaris)提供的"zoneinfo"时区数据库兼容,因此再次安装它是多余的。使用此选项时,将使用 DIRECTORY 中系统提供的时区数据库,而不是 PostgreSQL 源代码分发中包含的时区数据库。必须将 DIRECTORY 指定为绝对路径。/usr/share/zoneinfo 是某些操作系统上可能的目录。请注意,安装例程不会检测到不匹配或错误的时区数据。如果使用此选项,建议您运行回归测试以验证您指向的时区数据是否与 PostgreSQL 一起正常工作。
此选项主要针对非常了解其目标操作系统的二进制包分销商。使用此选项的主要优点是,每当许多本地夏令时规则中的任何一个更改时,都不需要升级 PostgreSQL 包。另一个优点是,如果在安装过程中不需要构建时区数据库文件,则可以更直接地交叉编译PostgreSQL。