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


81

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

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')

这给了我这个时区的所有大陆/首都组合,但不是确切的timezone。例如我得到:

Europe/Amsterdam
Europe/Berlin

服务器已安装,Berlin我想获取服务器的时区名称。

我有一个问题CET,它始终是UTC+01:00和不占DST iirc


柏林和阿姆斯特丹的正确时区名称是中欧时间(CET)。通常,时区名称和缩写的定义不明确。尽管有ISO标准,但许多国家/地区使用自己的定义。PostgreSQL支持也不完整,请参阅postgresql.org/docs/9.4/static/datetime-config-files.html了解更多详细信息。
Patrick

1
在pg_timezone_names表中,CET被定义为缩写,例如“ Europe / Berlin”作为名称。我需要名字而不是缩写。
Deutro

我在之前的评论中提供的链接向您展示了如何编辑文件以提供所需的内容。那是一样的好。
Patrick

因此,postgres没有办法告诉我我是在“欧洲/柏林”还是在“欧洲/阿姆斯特丹”,只是我处于时区CET?
Deutro

您可以编辑问题并定义“我在吗”?服务器(通常)位于固定位置,并且时区取自操作系统或配置文件。tz名称与服务器一样固定。那么,您确实想要服务器或数据库中数据的时区名称吗?
Patrick

Answers:


119

我认为在最一般的情况下,单独使用PostgreSQL是不可能的。安装PostgreSQL时,请选择一个时区。我敢肯定,默认设置是使用操作系统的时区。这通常会在postgresql.conf中反映为参数“ timezone”的值。但是该值最终以“ localtime”结尾。您可以通过SQL语句查看此设置。

show timezone;

但是,如果将postgresql.conf中的时区更改为“ Europe / Berlin”,show timezone;则将返回值,而不是“ localtime”。

因此,我认为您的解决方案将涉及将postgresql.conf中的“时区”设置为一个显式值,而不是默认的“ localtime”。


感谢您的回答。有点奇怪,无法获得系统时区。
Deutro 2015年

3
并设置时区,您可以使用set timezone to 'UTC'
ivkremer

@ivkremer:set timezone设置一个客户端会话的时区;它没有为PostgreSQL服务器设置时区。
Mike Sherrill'Cat Recall'17

@ MikeSherrill'CatRecall'谢谢,我没有检查。
ivkremer

25

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

SELECT EXTRACT(TIMEZONE FROM now())/3600.0;

上面的方法通过提取以分钟为单位的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)

docs)。


6
另一个用户建议使用SELECT EXTRACT(TIMEZONE_HOUR FROM now()),但这有点危险,因为它忽略同时存在一半和四分之一时区的事实。@giladMayani
koyae

2
“朝鲜,纽芬兰,印度,伊朗,阿富汗,委内瑞拉,缅甸,斯里兰卡,马萨诸塞州以及澳大利亚部分地区使用标准时间的半小时偏差。一些国家(例如尼泊尔)和某些省份(例如查塔姆群岛,使用四分之一小时的偏差。” 链接
koyae16年

21

Postgresql 9.5中似乎工作正常:

SELECT current_setting('TIMEZONE');

我运行了您的命令,尽管所有时区都相同,但它却返回了15200行。
Subhendu Mahanta

9

查看此答案:来源

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

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

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

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

从外壳获取操作系统本地时区。在psql中:

=> \! date +%Z

2
date +%Z该命令将返回客户端的时区,而不是您通过以下方式连接的服务器的时区psql
Eugen Konkov,

8

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

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • 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
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.