我在安装了Postgresql的CentOS 6.x上运行系统:
x86_64-unknown-linux-gnu上的PostgreSQL 9.0.11,由GCC gcc(GCC)4.1.2编译 20080704(Red Hat 4.1.2-52),64位
我现在面临的问题如下:
PostgreSQL配置:
\#timezone = unknown # actually, defaults to TZ environment
来自psql的会话配置:
select setting
from pg_settings
where name in ('TimeZone', 'timezone_abbreviations');
Israel
Default
---- - OS timezone is Israel: zdump -v /etc/localtime |grep 2013 /etc/localtime Thu Mar 28 23:59:59 2013 UTC = Fri Mar 29 01:59:59 2013 IST isdst=0 gmtoff=7200 /etc/localtime Fri Mar 29 00:00:00 2013 UTC = Fri Mar 29 03:00:00 2013 IDT isdst=1 gmtoff=10800 /etc/localtime Sat Oct 26 22:59:59 2013 UTC = Sun Oct 27 01:59:59 2013 IDT isdst=1 gmtoff=10800 /etc/localtime Sat Oct 26 23:00:00 2013 UTC = Sun Oct 27 01:00:00 2013 IST isdst=0 gmtoff=7200 ----
现在 - 按照zdump从夏季时区的转变应该在Sun Oct 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中显示,因为时区转换仅在
for 2013-09-06 00:00:00'::timestamptz
Sun Oct 27 01:00:00。
所以 2个问题:
答案 0 :(得分:3)
Postgres来源包含/src/timezone/data中的TZDB副本。随着Postgres的新版本发布,它会定期更新。
根据the revision history,撰写本文时的最新版本是2013d。这确实是包含您正在寻找的以色列变化的版本。请参阅2013d release announcement。因此,如果您可以更新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版。
但是由于你使用自己的tzdata副本在Linux系统上运行,你可以采用不同的方法并告诉Postgres使用那个数据而不是它自己的数据。从源代码构建postgres时,您必须为configure
提供参数。
--with-system-tzdata=DIRECTORY
PostgreSQL包含自己的时区数据库,它需要日期和时间操作。这个时区数据库实际上与许多操作系统(如FreeBSD,Linux和Solaris)提供的“zoneinfo”时区数据库兼容,因此再次安装它将是多余的。使用此选项时,将使用DIRECTORY中系统提供的时区数据库,而不是PostgreSQL源代码分发中包含的时区数据库。必须将DIRECTORY指定为绝对路径。 / usr / share / zoneinfo是某些操作系统上可能的目录。请注意,安装例程不会检测不匹配或错误的时区数据。如果使用此选项,建议您运行回归测试以验证您指向的时区数据是否与PostgreSQL一起正常工作。
此选项主要针对熟悉其目标操作系统的二进制包经销商。使用此选项的主要优点是,无论何时许多本地夏令时规则发生变化,都不需要升级PostgreSQL包。另一个优点是,如果在安装过程中不需要构建时区数据库文件,可以更直接地交叉编译PostgreSQL。