PostgreSQL时区与系统时区不匹配

我有几个Postgresql 9.2安装,其中Postgresql使用的时区是GMT,尽管整个系统是“欧洲/维也纳”.我仔细检查了 postgresql.conf不包含时区设置,因此根据文档它应该回退到系统的时区.

然而,

# 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版中已更改:

> 9.1 TimeZone:

(..) If not explicitly set,the server initializes this variable to the
time zone specified by its system environment. (…)

> 9.2 TimeZone:

(…) The built-in default is GMT,but that is typically overridden in
postgresql.conf; initdb will install a setting there corresponding to
its system environment. (…)

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

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

TimeZone = 'Europe/Vienna'

之后,您需要重新加载服务:

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

然后,从现在开始,所有存储为带时区(或时间戳)的时间戳的字段都将正确显示.但是你必须手动纠正所有(更新)存储为没有时区(或时间戳)的时间戳的字段.

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

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...