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

时间:2015-01-29 14:18:19

标签: postgresql datetime timezone

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

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

这为我提供了这个时区的所有大陆/资本组合,但不是确切的时区。例如,我得到:

Europe/Amsterdam
Europe/Berlin

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

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

5 个答案:

答案 0 :(得分:71)

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

show timezone;

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

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

答案 1 :(得分:14)

这可能会或可能不会帮助您解决您的问题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)。

答案 2 :(得分:9)

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

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

答案 3 :(得分:7)

请参阅此答案:Source

  

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

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

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

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

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

=> \! date +%Z

答案 4 :(得分:2)

Postgresql 9.5 中似乎可以正常使用:

SELECT current_setting('TIMEZONE');