尽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
设置的默认值已更改:
TimeZone
: (..)如果未明确设置,则服务器将此variables初始化为其系统环境指定的时区。 (……)
TimeZone
: (…)内置的默认值是GMT,但通常在postgresql.conf中被覆盖; initdb将在那里安装对应于它的系统环境的设置。 (……)
这意味着在版本9.2之前,应该在initdb
阶段设置postgresql.conf
的默认值。 如果你重写了这个值(可能在从旧版本升级的时候复制旧的postgresql.conf
),PostgreSQL将默认使用“GMT”值。
您的案例解决scheme非常简单,只需将postgresql.conf
的TimeZone
设置更改为所需的值即可:
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)。