Как PostgreSQL узнает, использую ли я в настоящее время DST в TimeZone 'CET'? - PullRequest
4 голосов
/ 09 октября 2019

Я нашел следующую строку в моем postgresql.conf:

timezone = 'CET'

И я также получаю это, запрашивая настройки:

postgres=# show timezone;
 TimeZone
----------
 CET

В любом случае, у нас все еще есть летнее времяactive и следующий пример показывает, что сервер знает это (+02 - CEST):

postgres=# select now();
              now
-------------------------------
 2019-10-09 02:03:33.48477+02

Но существуют также часовые пояса, известные PostgreSQL, которые сокращены 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

Теперь я запутался в этом, а также в значении этой аббревиатуры и настройке 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

Итак, наконец, вот мои вопросы:

Как это действительно работает? Есть ли где-нибудь параметр, определяющий использование определенных правил летнего времени? Вывод, который я получаю, - это то, что я ожидал от часового пояса типа Europe/Berlin, в котором есть правила летнего времени. Но что, если мне нужно, чтобы моя база данных работала в реальном CET (без DST)? Или есть другая конфигурация, которую я не видел, которая переопределяет TimeZone?

Также мне интересно, как работает AT TIME ZONE. В документации я обнаружил следующее:

Они преобразуются в местное время в зоне, указанной параметром конфигурации TimeZone, перед тем, как отобразиться на клиенте.

Но, как показывает мой запрос, это не совсем применимо. На этой же странице есть также следующее утверждение, которое, кажется, также не применяется (log_timezone также CET):

Вы не можете установить параметры конфигурации TimeZone или log_timezone для временисокращение зоны, но вы можете использовать сокращения во входных значениях даты / времени и с оператором AT TIME ZONE.

Я что-нибудь перепутал? Или это их известные ошибки (и, возможно, они исправлены в более новых версиях)? Документы не так?

Мой PostgreSQL version() равен PostgreSQL 9.6.5, compiled by Visual C++ build 1800, 64-bit.

( Отказ от ответственности : я несколько доволен тем, что он делает,по крайней мере, кроме «проблемы» с AT TIME ZONE, так как я нахожусь в Германии, и у нас есть летнее время. Но я не понимаю, почему CET по умолчанию использует DST, и мне интересно, есть ли параметр для выключения / настройкиЯ также чувствую, что что-то не так со спецификацией AT TIME ZONE или поведением по умолчанию соответственно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...