postgres默认时区

Blu*_*ers 81 postgresql

我安装了PostgreSQL 9,它显示的时间比服务器时间晚1小时.

跑步PostgreSQL 9节目:Select NOW()

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

落后1小时,但phppgadmin显示的时区为:TimeZone Etc/GMT0

我试过进入postgresql.conf并设置timezone = GMT然后运行重启但没有改变.

我认为它会使用服务器时区的任何想法,但显然不是吗?!

解决方案!:之前我确实设置了GMT,它落后了一个小时......之后搜索结果我需要将它设置为欧洲/伦敦.这考虑到英国夏季的+1小时,GMT没有!

Muh*_*ama 96

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

文档.

set timezone TO 'GMT';
Run Code Online (Sandbox Code Playgroud)

或者,更严格地遵循SQL标准,使用该SET TIME ZONE命令.注意"TIME ZONE"的两个单词,其中上面的代码使用单个单词"timezone".

SET TIME ZONE 'UTC';
Run Code Online (Sandbox Code Playgroud)

该文件解释了差异:

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

  • 我试过在postgresql.conf中将时区更改为GMT,它似乎工作正常. (4认同)
  • 是的 'set timezone To ..' 只设置当前会话的时区,如果你在 Postgresql.conf 中更改时区配置参数,它应该更改所有数据库的时区。 (3认同)
  • 我尝试设置它,它似乎没有用,也没有设置它仅用于活动会话。我希望为所有数据库永久更改它,我在phpmyadmin中很容易做到这一点,但似乎找不到一种方法来解决PostgreSQL (2认同)

Iur*_*ilo 76

从以下位置选择时区:

SELECT * FROM pg_timezone_names;
Run Code Online (Sandbox Code Playgroud)

并设置示例:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';
Run Code Online (Sandbox Code Playgroud)

使用您的数据库名称.

  • @JoeyPinto不是真的,它足以发出`SELECT pg_reload_conf();`:) (17认同)
  • 完成后需要重启postgresql服务 (5认同)
  • 我使用数据库名称运行该语句,“SELECT pg_reload_conf()”返回 true,但“now()”和“select current_setting('TIMEZONE')”继续返回“America/New_York”的值。是因为我不是超级用户吗? (5认同)
  • @Prempopatia 也许是一个菜鸟问题:你尝试刷新 pgadmin 本身吗? (2认同)
  • @Noumenon 对我来说,关闭和打开 pgadmin 有帮助。 (2认同)

gue*_*los 44

要在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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

3.-重启Postgres

  • 我建议你**完全避免那些3或4个字母代码**.它们既不标准也不独特.而是使用[适当的时区名称](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)(大陆SLASH城市或区域).为了使用你自己的例子,巴拿马全年使用"-05:00"的偏移,而纽约在夏令时间(DST)下移动一小时.时区不仅仅是一个偏移; 时区包括过去,现在和将来的一组规则和异常,例如夏令时.所以,说出你的意思:`America/Panama`,`America/New_York`,`Europe/London`,`UTC`(或`Zulu`). (14认同)
  • 根据 [PostGRE docs](http://www.postgresql.org/docs/9.1/static/datatype-datetime.html#DATATYPE-TIMEZONES),您可以检查内部视图以获取已识别时区名称的列表在您的特定数据库中,通过执行 ```SELECT * FROM pg_timezone_names``` 这可能更安全,因为 3rd-party 站点不一定像您自己的站点一样最新(或过时)特定的数据库实例。 (3认同)
  • 这实际上是正确的答案,因为它使得PGZ中的每个进程的TZ更改都是默认的,而不仅仅是当前用户. (2认同)
  • 您可以运行“select pg_reload_conf()”,而不是重新启动 PostgreSQL。 (2认同)

Bas*_*que 32

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

配置参数名称

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

SET timezone TO 'UTC';
Run Code Online (Sandbox Code Playgroud)

...其中timezone不是SQL命令,它是配置参数的名称.

请参阅文档.

标准SQL命令

或者,您可以使用SQL规范定义的SQL命令:SET TIME ZONE.在这种语法中,一对单词TIME ZONE取代"timezone"(实际SQL命令与参数名称),并且没有"TO".

SET TIME ZONE 'UTC';
Run Code Online (Sandbox Code Playgroud)

此命令和上面的命令都具有相同的效果,仅设置当前会话的值.要使更改成为永久更改,请参阅此兄弟答案.

请参阅文档.

时区名称

您可以指定适当的时区名称.其中大部分是大陆/地区.

SET TIME ZONE 'Africa/Casablanca';
Run Code Online (Sandbox Code Playgroud)

…要么…

SET TIME ZONE 'America/Montreal';
Run Code Online (Sandbox Code Playgroud)

避免使用3或4个字母的缩写,例如ESTIST它们既不标准也不唯一.

获取当前区域

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

SHOW timezone ;
Run Code Online (Sandbox Code Playgroud)

…要么…

SHOW time zone ;
Run Code Online (Sandbox Code Playgroud)

美国/太平洋

  • 作为提供“SHOW”部分的唯一答案的加分点 (7认同)
  • 罗杰,Ariel Allon——对于下一个想要将该时区选择到变量中的人...`SELECT current_setting('TIMEZONE')` (2认同)

Pas*_*cal 9

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

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

在pgAdmin III中配置Postgres


ARA*_*307 8

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

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

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

否则,无论您在其他地方设置了什么,您都会看到“UTC”。

  • @Cpt.Senkfuss,我相信类似 -Duser.timezone=Australia/Tasmania 的东西也应该起作用并照顾夏季\冬季的变化。 (2认同)

Jay*_*Jay 8

对于想要永久更改它的 Windows 10/11 用户,该文件位于:

C:\Program Files\PostgreSQL\<your-postgres-version>\data\postgresql.conf
Run Code Online (Sandbox Code Playgroud)

对我来说具体是:

C:\Program Files\PostgreSQL\14\data\postgresql.conf
Run Code Online (Sandbox Code Playgroud)

然后在文本编辑器中ctrl-f查找timezone以下行并将其重置为您的首选时区(可以通过运行找到名称SELECT * FROM pg_timezone_names):

log_timezone = 'UTC'
Run Code Online (Sandbox Code Playgroud)

timezone = 'UTC'
Run Code Online (Sandbox Code Playgroud)

在数据库 GUI 或 CLI 中运行以下查询来重新加载配置文件。

select pg_reload_conf()
Run Code Online (Sandbox Code Playgroud)

通过运行以下命令确认永久更改:

show timezone
Run Code Online (Sandbox Code Playgroud)

  • 同样的技巧在 Linux 系统中也适用于我。我在版本 12 中做到了这一点。 (2认同)