PostgreSQL 如何知道我当前是否在时区“CET”中使用 DST?

Isl*_*gre 5 postgresql timezone timestamp-with-timezone postgresql-9.6

我在我的中找到了以下行postgresql.conf

timezone = 'CET'
Run Code Online (Sandbox Code Playgroud)

我也通过查询设置得到了这个:

postgres=# show timezone;
 TimeZone
----------
 CET
Run Code Online (Sandbox Code Playgroud)

无论如何,我们目前仍然有 DST 活动,下面的示例显示服务器知道这一点(+02 是 CEST):

postgres=# select now();
              now
-------------------------------
 2019-10-09 02:03:33.48477+02
Run Code Online (Sandbox Code Playgroud)

但也有 PostgreSQL 已知的时区,缩写为 DST CET,并且没有 DST。特别是,所有具有此缩写的时区都有偏移+01:

postgres=# select * from pg_timezone_names() where abbrev = 'CET';
      name      | abbrev | utc_offset | is_dst
----------------+--------+------------+--------
 Africa/Algiers | CET    | 01:00:00   | f
 Africa/Tunis   | CET    | 01:00:00   | f

postgres=# select * from pg_timezone_abbrevs where abbrev = 'CET';
 abbrev | utc_offset | is_dst
--------+------------+--------
 CET    | 01:00:00   | f
Run Code Online (Sandbox Code Playgroud)

我现在对此以及这个缩写和设置的含义感到困惑TimeZone。我预计,每个timestamp with time zone都会显示在此参数设置的时区中。但显然,这并不成立:

postgres=# select now(), now() AT TIME ZONE (SELECT setting FROM pg_settings WHERE name = 'TimeZone');
             now              |         timezone
------------------------------+---------------------------
 2019-10-09 02:03:33.48477+02 | 2019-10-09 01:03:33.48477
Run Code Online (Sandbox Code Playgroud)

最后,这是我的问题:

这到底是如何运作的?是否有任何设置指定使用某些 DST 规则?我得到的输出是我对Europe/Berlin具有 DST 规则的时区的预期。但是,如果我需要我的数据库在真正的 CET 中运行(因此没有任何 DST)怎么办?或者是否有另一个我没有看到的配置,它会覆盖TimeZone

我也想知道如何AT TIME ZONE运作。在文档中,我发现了以下内容:

在显示给客户端之前,它们会转换为 TimeZone 配置参数指定的区域中的本地时间。

但正如我的查询所示,这并不真正适用。在同一页上还有以下声明,似乎也不适用(也是log_timezoneCET

您无法将配置参数 TimeZone 或 log_timezone 设置为时区缩写,但可以在日期/时间输入值中以及与 AT TIME ZONE 运算符一起使用缩写。

我混淆了什么吗?或者他们有一些已知的错误(并且它们可能在新版本中修复)?这些文档是错误的吗?

我的 PostgreSQLversion()PostgreSQL 9.6.5, compiled by Visual C++ build 1800, 64-bit.

免责声明:我对它正在做的事情有点高兴,至少除了“问题”之外AT TIME ZONE,因为我在德国并且我们有夏令时。但我不明白为什么CET默认使用夏令时,我想知道是否有一个参数来关闭/配置它。而且我觉得规范AT TIME ZONE或默认行为分别有问题。)