如何在Postgres 9.3中获取当前时区名称?

Deu*_*tro 61 postgresql timezone datetime

我想获得当前的时区名称.我已经实现的是通过以下方式获取utc_offset/timezone缩写:

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')
Run Code Online (Sandbox Code Playgroud)

这给了我这个时区的所有大陆/资本组合,但不是确切的时区.比如我得到:

Europe/Amsterdam
Europe/Berlin
Run Code Online (Sandbox Code Playgroud)

服务器在柏林,我想获得服务器的时区名称.

我在CET上遇到的问题是它始终是UTC + 01:00并且不考虑DST iirc.

Mik*_*ll' 86

我不认为在最常见的情况下单独使用PostgreSQL是可行的.安装PostgreSQL时,选择一个时区.我很确定默认是使用操作系统的时区.这通常会在postgresql.conf中反映为参数"timezone"的值.但价值最终成为"当地时间".您可以使用SQL语句查看此设置.

show timezone;
Run Code Online (Sandbox Code Playgroud)

但是如果你将postgresql.conf中的时区更改为"Europe/Berlin",那么show timezone;将返回值而不是"localtime".

所以我认为你的解决方案将涉及将postgresql.conf中的"timezone"设置为显式值而不是默认的"localtime".

  • 要设置时区,您可以使用`set timezone to'UTC'`. (2认同)
  • @ivkremer:`set timezone` 设置一个客户端会话的时区;它不设置 PostgreSQL 服务器的时区。 (2认同)

koy*_*yae 17

这可能会或可能不会帮助您解决您的问题OP,但要获取当前服务器相对于UTC(UT1,技术上)的时区,请执行以下操作:

SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
Run Code Online (Sandbox Code Playgroud)

以上工作原理是通过以分钟为单位提取UT1相对偏移量,然后使用3600秒/小时因子将其转换为小时数.

例:

SET SESSION timezone TO 'Asia/Kabul';
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
-- output: 4.5 (as of the writing of this post)
Run Code Online (Sandbox Code Playgroud)

(docs).

  • 另一个用户[建议](http://stackoverflow.com/review/suggested-edits/12763260)使用`SELECT EXTRACT(TIMEZONE_HOUR FROM now())`,但这有点危险,因为它忽略了****那里有**半时区和四分之一时区**.@giladMayani (6认同)
  • _"朝鲜,纽芬兰,印度,伊朗,阿富汗,委内瑞拉,缅甸,斯里兰卡,马克萨斯以及澳大利亚部分地区使用半小时偏离标准时间.一些国家,如尼泊尔和一些省份,如作为查塔姆群岛,使用四分之一小时的偏差."_([link](https://en.wikipedia.org/wiki/Time_zone#Worldwide_time_zones)) (2认同)

小智 13

您可以通过以下脚本访问时区:

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
Run Code Online (Sandbox Code Playgroud)
  • current_setting('TIMEZONE') 会给你设置的大陆/首都信息
  • pg_timezone_names 视图 pg_timezone_names 提供了 SET TIMEZONE 识别的时区名称列表,以及它们相关的缩写、UTC 偏移量和夏令时状态。
  • 视图中的名称列 (pg_timezone_names) 是时区名称。

输出将是:

name- Europe/Berlin, 
abbrev - CET, 
utc_offset- 01:00:00, 
is_dst- false
Run Code Online (Sandbox Code Playgroud)


小智 10

It seems to work fine in Postgresql 9.5:

SELECT current_setting('TIMEZONE');
Run Code Online (Sandbox Code Playgroud)


Igo*_*nze 8

看到这个答案:来源

如果未在postgresql.conf中指定timezone或作为服务器命令行选项,则服务器会尝试将TZ环境变量的值用作默认时区.如果未定义TZ或者不是PostgreSQL已知的任何时区名称,则服务器会通过检查C库函数localtime()的行为来尝试确定操作系统的默认时区.选择默认时区作为PostgreSQL已知时区中最接近的匹配项.(这些规则也用于选择log_timezone的默认值,如果未指定.)

这意味着如果您没有定义时区,服务器会尝试通过检查C库函数localtime()的行为来确定操作系统的默认时区.

如果未在postgresql.conf中指定timezone或作为服务器命令行选项,则服务器会尝试将TZ环境变量的值用作默认时区.

似乎确实可以设置系统的时区.

从shell获取操作系统本地时区.在psql中:

=> \! date +%Z
Run Code Online (Sandbox Code Playgroud)

  • `date +%Z` 命令将返回客户端的时区,而不是您通过 `psql` 连接的服务器的时区 (2认同)