PostgreSQL时区与系统时区不匹配

尽pipe整个系统是“欧洲/维也纳”,但PostgreSQL使用的时区是GMT,我有几个PostgreSQL 9.2安装。 我仔细检查postgresql.conf不包含timezone设置,所以根据文档它应该回退到系统的时区。

然而,

 # su -s /bin/bash postgres -c "psql mydb" mydb=# show timezone; TimeZone ---------- GMT (1 row) mydb=# select now(); now ------------------------------- 2013-11-12 08:14:21.697622+00 (1 row) 

任何提示,GMT时区可能来自哪里? 系统用户没有设置TZ/etc/timezone/etc/timeinfo似乎configuration正确。

 # cat /etc/timezone Europe/Vienna # date Tue Nov 12 09:15:42 CET 2013 

任何提示都表示感谢,提前感谢!

    版本9.2中, TimeZone设置的默认值已更改:

    • 9.1时TimeZone

    (..)如果未明确设置,则服务器将此variables初始化为其系统环境指定的时区。 (……)

    • 9.2时TimeZone

    (…)内置的默认值是GMT,但通常在postgresql.conf中被覆盖; initdb将在那里安装对应于它的系统环境的设置。 (……)

    这意味着在版本9.2之前,应该在initdb阶段设置postgresql.conf的默认值。 如果你重写了这个值(可能在从旧版本升级的时候复制旧的postgresql.conf ),PostgreSQL将默认使用“GMT”值。

    您的案例解决scheme非常简单,只需将postgresql.confTimeZone设置更改为所需的值即可:

     TimeZone = 'Europe/Vienna' 

    之后,你需要reload服务:

     # su - postgres -c "psql mydb -c 'SELECT pg_reload_conf()'" 

    然后,所有timestamp with time zone (或timestamptz )存储的字段将从现在开始正确显示。 但是你将不得不手动纠正(更新)存储为timestamp without time zone的字段, timestamp without time zone (或timestamp )。

    我给大家升级PostgreSQL的提示并不是将旧的postgresql.conf复制到新的群集中(注意我不确定它是否做了什么,但是我也看到了这个问题)。 只要得到由initdb生成的一个,并添加修改( diff工具可能对此任务很less)。