postgresql不正确的时区从夏天时间变化

时间:2013-11-06 10:24:22

标签: sql postgresql datetime timezone

我在安装了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个问题

  1. postgresql如何保持时区转换的日期以及如何检查当前值。
  2. 如何解决此问题。

1 个答案:

答案 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提供参数。

来自the documentation here

  

--with-system-tzdata=DIRECTORY

     

PostgreSQL包含自己的时区数据库,它需要日期和时间操作。这个时区数据库实际上与许多操作系统(如FreeBSD,Linux和Solaris)提供的“zoneinfo”时区数据库兼容,因此再次安装它将是多余的。使用此选项时,将使用DIRECTORY中系统提供的时区数据库,而不是PostgreSQL源代码分发中包含的时区数据库。必须将DIRECTORY指定为绝对路径。 / usr / share / zoneinfo是某些操作系统上可能的目录。请注意,安装例程不会检测不匹配或错误的时区数据。如果使用此选项,建议您运行回归测试以验证您指向的时区数据是否与PostgreSQL一起正常工作。

     

此选项主要针对熟悉其目标操作系统的二进制包经销商。使用此选项的主要优点是,无论何时许多本地夏令时规则发生变化,都不需要升级PostgreSQL包。另一个优点是,如果在安装过程中不需要构建时区数据库文件,可以更直接地交叉编译PostgreSQL。