PostgreSQL 时区与系统时区不匹配

Mar*_* C. 18 postgresql timezone

尽管整个系统是“欧洲/维也纳”,但我有几个 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)
Run Code Online (Sandbox Code Playgroud)

任何提示,格林威治标准时间时区可能来自哪里?系统用户没有TZ设置/etc/timezone并且/etc/timeinfo似乎配置正确。

# cat /etc/timezone 
Europe/Vienna
# date
Tue Nov 12 09:15:42 CET 2013
Run Code Online (Sandbox Code Playgroud)

任何提示表示赞赏,提前致谢!

小智 25

该设置的默认值TimeZone在 9.2 版中已更改:

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

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

这意味着在 9.2 版本之前,postgresql.conf应该在initdb阶段设置默认值 at 。如果您覆盖该值(可能postgresql.conf在从旧版本升级时复制旧的),PostgreSQL 将使用“GMT”值作为默认值。

您的情况的解决方案非常简单,只需将TimeZone设置更改为postgresql.conf您想要的值:

TimeZone = 'Europe/Vienna'
Run Code Online (Sandbox Code Playgroud)

之后你需要reload服务:

# su - postgres -c "psql mydb -c 'SELECT pg_reload_conf()'"
Run Code Online (Sandbox Code Playgroud)

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

我给升级 PostgreSQL 的每个人的一个提示是不要将旧postgresql.conf的集群复制到新的集群(请注意,我不确定您是否做了什么,但因此我看到了很多相同的问题)。只需获取由 生成的initdb并添加修改(diff此任务可能需要一个工具)。