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

lsmepo6l  于 2022-09-21  发布在  PostgreSQL
关注(0)|答案(5)|浏览(174)

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

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

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

Europe/Amsterdam
Europe/Berlin

服务器在Berlin中,我想获取服务器的时区名称。

我对CET的问题是,它始终是UTC+01:00,而不是DST iirc

wi3ka0sx

wi3ka0sx1#

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

show timezone;

但是,如果您将postgresql.conf中的时区更改为类似于“欧洲/柏林”的值,则show timezone;将返回“那个”值而不是“localtime”。

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

jmo0nnb3

jmo0nnb32#

PostgreSQL 9.5中似乎运行得很好:

SELECT current_setting('TIMEZONE');
hc2pp10m

hc2pp10m3#

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

(文档)。

icnyk63a

icnyk63a4#

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

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • CURRENT_SETING(‘TIMEZONE’)将为您提供设置的大陆/首都信息
  • PG_TIMEZONE_NAMES视图PG_TIMEZONE_NAMES提供设置时区可识别的时区名称列表,及其关联的缩写、UTC偏移量和夏令时状态。
  • 视图中的名称列(PG_TIMEZONE_NAMES)是时区名称。

输出将为:

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

kx1ctssn5#

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

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

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

似乎要设置系统的时区确实是可能的。

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

=> ! date +%Z

相关问题