PostgreSQL时区与系统时区不符


17

我有几个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

任何提示表示赞赏,在此先感谢!

Answers:


24

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

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

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

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

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

TimeZone = 'Europe/Vienna'

之后,您需要reload服务:

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

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

我给每个升级PostgreSQL的人的提示是不要将旧的复制postgresql.conf到新的集群(注意,我不确定它是否与您一样,但是由于这个原因,我看到了很多相同的问题)。只需获取由生成的代码,initdb然后添加修改(一种diff工具可以完成此任务)。


非常感谢,我没有注意到从9.1到9.2的更改。是的,将时区信息添加到postgresql.conf是一个微不足道的修复程序,我只是无法解释为什么它会退回到GMT。显然,我一直都无意中发现了9.1文档,因为我不希望默认行为从9.1到9.2发生如此大的变化。
Martin C.

但是,您的数据库应始终使用UTC(GMT)。使时间更易于比较。可以随时更改客户端/会话的时区。在pg中设置时区x。stackoverflow.com/questions/2532729/…–
尼尔·麦圭根

postgresql.conf对于9.2+版,是否有任何方法可以指定仍应自动检测系统环境时区?
凯尔·斯特兰德

0

我找到了解决方法。

只需在/ usr / share / zoneinfo /内创建一个名为localtime(或您希望使用的名称)的符号链接,使其指向/ etc / localtime

/usr/share/zoneinfo/localtime -> /etc/localtime

这样,您将创建一串链接,这些链接最终指向系统的时区。

/etc/localtime -> /usr/share/zoneinfo/America/Los_Angeles

现在获取您创建的链接的名称(在本例中为localtime)并将其用作postgresql.conf中的配置项的值。

TimeZone = 'localtime'

重新启动postgresql并使用“ SELECT now();”检查时间。和“显示时区”;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.