How do I get the current timezone name in Postgres 9.3?

我要获取当前时区名称。 我已经通过以下方式获得了 utc_offset/时区缩写:

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

这给了我这个时区的所有大陆/资本组合,但不是准确的 timezone。例如:

Europe/Amsterdam
Europe/Berlin

The server is in Berlin and I want to get the timezone name of the server.

我与 CET的问题,它始终是 UTC+01:00,并没有考虑到 DST iirc

181631 次浏览

我认为在大多数情况下,单独使用 PostgreSQL 是不可能的。安装 PostgreSQL 时,需要选择一个时区。我很确定默认使用的是操作系统的时区。这通常作为参数“ timezone”的值反映在 postgreql.conf 中。但是这个值最终是“本地时间”。可以通过 SQL 语句查看此设置。

show timezone;

但是如果您将 postgreql.conf 中的时区更改为类似于“ Europe/Berlin”的内容,那么 show timezone;将返回 那个值而不是“ localtime”。

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

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)

(医生).

看看这个答案: 来源

If timezone is not specified in postgresql.conf or as a server command-line option, the server attempts to use the value of the TZ environment variable as the default time zone. If TZ is not defined or is not any of the time zone names known to PostgreSQL, the server attempts to determine the operating system's default time zone by checking the behavior of the C library function localtime(). The default time zone is selected as the closest match among PostgreSQL's known time zones. (These rules are also used to choose the default value of log_timezone, if not specified.) 来源

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

If timezone is not specified in postgresql.conf or as a server command-line option, the server attempts to use the value of the TZ environment variable as the default time zone.

它似乎有系统的时区设置的确是可能的。

从 shell 获取 OS 本地时区:

=> \! date +%Z

它似乎在 事后9.5中工作得很好:

SELECT current_setting('TIMEZONE');

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

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • current_setting('TIMEZONE') will give you Continent / Capital information of settings
  • 视图 pg _ timezone _ Names 提供了一个时区名称列表,这些时区名称是 由 SET TIMEZONE 识别,以及它们相关的缩写、 UTC 偏移量和 daylight-savings status.
  • 在视图中的 name 列(pg _ timezone _ Names)是时区名称。

output will be :

name- Europe/Berlin,
abbrev - CET,
utc_offset- 01:00:00,
is_dst- false