我想获取当前时区名称。我已经实现的是通过以下方式获得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