postgres默认时区


99

我安装好PostgreSQL 9了,显示的时间比服务器时间晚了1个小时。

跑步Select NOW()表演:2011-07-12 11:51:50.453842+00

服务器日期显示: Tue Jul 12 12:51:40 BST 2011

现在晚了1小时,但显示的时区phppgadmin是:TimeZone Etc/GMT0

我尝试进入postgresql.conf和设置

时区= GMT

然后运行重新启动但没有更改。

我以为会使用服务器时区的任何想法,但显然没有吗?!

解决方案::我确实定于GMT之前,但已经晚了一个小时。经过搜索后,我需要将其设置为Europe/London。这考虑了英国夏令时的+1小时,GMT则没有!

Answers:


113

时区是会话参数。因此,您可以更改当前会话的时区。

参见文档

set timezone TO 'GMT';

或者,更紧密地遵循SQL标准,使用SET TIME ZONE命令。注意“时区”两个词,其中上面的代码使用单个词“时区”。

SET TIME ZONE 'UTC';

该文档解释了差异:

SET TIME ZONE扩展了SQL标准中定义的语法。该标准仅允许数字时区偏移,而PostgreSQL允许更灵活的时区规范。所有其他SET功能都是PostgreSQL扩展。


2
我尝试设置它,它似乎没有用,也没有设置它仅用于活动会话。我希望为所有数据库永久更改它,我在phpmyadmin中轻松完成了此操作,但似乎找不到为postgresql做到这一点的方法
Blu Towers

yup'set timezone To ..'仅设置当前会话的时区,如果您在Postgresql.conf中更改时区配置参数,则应更改所有数据库的时区。
穆罕默德·乌萨马

4
我已尝试通过将postgresql.conf中的时区更改为GMT来尝试,但似乎工作正常。
穆罕默德·乌萨玛

更标准(符合SQL规范)是“时区”的两个词:SET TIME ZONE 'UTC';。参见文档
罗勒·布尔克

102

timezone从以下选择:

SELECT * FROM pg_timezone_names;

set如下例所示:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';

使用您的数据库名称代替postgres上述声明。


4
完成此操作后,您需要重新启动postgresql服务
Joey Pinto

24
@JoeyPinto不正确,它足以发出SELECT pg_reload_conf();:)
Alphaaa

4
我跑了声明与我的数据库名和SELECT pg_reload_conf()返回真实的,但now()select current_setting('TIMEZONE')继续为“美国/纽约”返回值。是因为我不是超级用户?
Noumenon

48

要完成Postgres 9.1中的时区更改,您必须:

1.-在/usr/share/postgresql/9.1/的“ timezones”文件夹中搜索适当的文件,在我的情况下为“ America.txt”,在其中搜索与您的区域最近的位置并将其复制左列中的第一个字母。

例如:如果您在“纽约”或“巴拿马”,则为“ EST”:

#  - EST: Eastern Standard Time (Australia)
EST    -18000    # Eastern Standard Time (America)
                 #     (America/New_York)
                 #     (America/Panama)

2.-取消注释文件中的“时区”行,postgresql.conf并按如下所示放置您的时区:

#intervalstyle = 'postgres'
#timezone = '(defaults to server environment setting)'
timezone = 'EST'
#timezone_abbreviations = 'EST'     # Select the set of available time zone
                                        # abbreviations.  Currently, there are
                                        #   Default
                                        #   Australia

3.-重新启动Postgres


3
这实际上是正确的答案,因为它使PGSQL中每个进程(不仅是当前用户)的TZ更改都默认设置。
jfreak53 2014年

15
我建议您完全避免使用3或4个字母代码。它们既不是标准化的也不是唯一的。而是使用正确的时区名称(大陆SLASH城市或区域)。以您自己的示例为例,巴拿马使用−05:00全年偏移量,而纽约使用夏令时(DST)偏移一个小时。时区不仅仅是偏移量;时区包括过去,现在和将来的规则和异常集,例如DST。所以,说你的意思:America/PanamaAmerica/New_YorkEurope/LondonUTC(或Zulu)。
罗勒·布尔克

3
根据PostGRE文档,您可以检查内部视图,以获取特定数据库中公认的时区名称的列表,这样做SELECT * FROM pg_timezone_names可能更安全,因为第三方网站不一定是最新的(或已过期)作为您自己的特定数据库实例。
SeldomNeedy

我没有共享该文件夹postgresql
SuperUberDuper

您可以运行而不是重新启动PostgreSQL select pg_reload_conf()
ANeves

42

接受的答案穆罕默德·乌萨马·本是正确的。

配置参数名称

该答案显示了如何使用以下命令设置Postgres特定的配置参数:

SET timezone TO 'UTC';

…哪里timezone不是SQL命令,它是配置参数的名称。

请参阅此文档

标准SQL命令

或者,您可以使用SQL规范定义的SQL命令:SET TIME ZONE。在这种语法中,一对单词TIME ZONE替换了“时区”(实际的SQL命令与参数名),并且没有“ TO”。

SET TIME ZONE 'UTC';

此命令和上面的命令具有相同的效果,仅设置当前会话的值。要使更改永久生效,请参阅以下同级答案

请参阅此文档

时区名称

您可以指定适当的时区名称。其中大多数是大陆/地区。

SET TIME ZONE 'Africa/Casablanca';

…要么…

SET TIME ZONE 'America/Montreal';

避免使用3或4个字母的缩写,例如EST或,IST因为它们既不是标准化的也不是唯一的。有关时区名称的列表,请参见Wikipedia 。

获取当前区域

要查看会话的当前时区,请尝试以下任一语句。从技术上讲,我们正在调用SHOW命令以显示运行时参数。

SHOW timezone ;

…要么…

SHOW time zone ;

美国/太平洋


4
作为提供该SHOW零件的唯一答案的奖励积分
Ariel Allon

罗杰,阿里尔·艾伦(Ariel Allon),以及下一个想要将时区选择为变量的人SELECT current_setting('TIMEZONE')
Wellspring,

10

除了先前的答案,如果您使用工具pgAdmin III,则可以按以下方式设置时区:

  1. 通过工具>服务器配置> postgresql.conf打开Postgres配置
  2. 查找输入时区,然后双击以打开
  3. 改变价值
  4. 重新加载服务器以应用配置更改(顶部的“播放”按钮或通过服务)

pgAdmin III中的Postgres配置


3

请注意,许多第三方客户端都有自己的时区设置,与任何Postgres服务器和/或会话设置重叠。

例如,如果您使用的是“ IntelliJ IDEA 2017.3”(或DataGrips),则应将时区定义为:

'数据库源属性'->'高级'选项卡->'虚拟机选项':-Duser.timezone = UTC + 06:00

否则,无论您在其他任何地方进行了什么设置,您都将看到“ UTC”。


所以这需要与夏/冬时间变化保持同步吗?
CPT。Senkfuss

1
@ Cpt.Senkfuss,我相信-Duser.timezone = Australia / Tasmania之类的东西也应该起作用,并应注意夏季/冬季的变化。
ARA1307 '18

这是一个拯救生命的把戏。我一直在尝试3个小时,直到现在为止出了什么问题:)顺便说一句,尝试了全时区名称,它可以工作。对我来说,它是-Duser.timezone = Europe / Istanbul
Olgun Kaya

0

也许与问题无关,但是我需要使用CST,将系统时区设置为所需的tz(America / ...),然后在PostgreSQL conf中将时区的值设置为“ localtime”,它起到了一种魅力,current_time打印正确的时间(在Ubuntu 16上为Postgresql 9.5)

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.