我有几个 PostgreSQL 9.2 安装,其中 PostgreSQL 使用的时区是 GMT,尽管整个系统是“欧洲/维也纳”。我仔细检查了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
似乎配置正确。
# cat /etc/timezone
Europe/Vienna
# date
Tue Nov 12 09:15:42 CET 2013
任何提示表示赞赏,在此先感谢!
该设置的默认值
TimeZone
在 9.2 版中已更改:TimeZone
:TimeZone
:这意味着在 9.2 版本之前的默认值
postgresql.conf
应该在initdb
阶段设置。如果您覆盖了该值(可能postgresql.conf
在从旧版本升级时复制旧值)PostgreSQL 将使用“GMT”值作为默认值。您的情况的解决方案非常简单,只需将
TimeZone
设置更改为postgresql.conf
您想要的值:之后,您需要
reload
服务:然后从现在开始正确显示存储为
timestamp with time zone
(或)的所有字段。timestamptz
但是您必须手动更正所有(更新)存储为timestamp without time zone
(或timestamp
)的字段。我给每个升级 PostgreSQL 的人的提示是不要将旧的集群复制
postgresql.conf
到新的集群(注意我不确定你是否做了什么,但我经常看到同样的问题)。只需获取由生成的initdb
并添加修改(diff
此任务可能需要一个工具)。我找到了解决方法。
只需在/usr/share/zoneinfo/中创建一个名为localtime(或您希望的任何名称)的符号链接,以指向/etc/localtime
这样,您将创建最终指向系统时区的链接字符串。
现在取您创建的链接的名称(在我的情况下为localtime)并将其用作 postgresql.conf 中配置项的值
重新启动 postgresql 并使用“SELECT now();”检查时间 和“显示时区;”