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



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

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

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

Europe/Amsterdam
Europe/Berlin

服务器处于Berlin状态,我想获取服务器的时区名称。

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

我认为在

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

show timezone;

但是,如果您在postgresql.conf中将时区更改为"欧洲/柏林"之类的时区,则show timezone;将返回值而不是"localtime"。

所以我认为您的解决方案将涉及将 postgresql.conf 中的"时区"设置为显式值而不是默认的"本地时间"。

它似乎在Postgresql 9.5中工作正常:

SELECT current_setting('TIMEZONE');

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

(文档)。

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

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • current_setting("时区")将为您提供设置的大陆/首都信息
  • pg_timezone_names 视图pg_timezone_names提供时区名称的列表,这些时区名称是由 SET 时区识别,以及它们相关的缩写、UTC 偏移量和夏令时状态。
  • 视图中的名称列 (pg_timezone_names) 是时区名称。

输出将为:

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

看到这个答案: 来源

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

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

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

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

从命令行管理程序获取操作系统本地时区。在 psql 中:

=> ! date +%Z

相关内容

  • 没有找到相关文章

最新更新