Nazwy stref czasowych o identycznych właściwościach dają inny wynik po zastosowaniu do znacznika czasu

Spędziłem godzinę w rozpaczy z powodu rozbieżności w tych wynikach tych dwóch wyrażeń:


db=# SELECT '2012-01-18 1:0 CET'::timestamptz AT TIME ZONE 'UTC'
           ,'2012-01-18 1:0 Europe/Vienna'::timestamptz AT TIME ZONE 'UTC';
      timezone       |      timezone
---------------------+---------------------
 2012-08-18 00:00:00 | 2012-08-17 23:00:00

Oczywiście drugie wyrażenie odlicza dwie godziny zgodnie z regułami DST, przy czym pierwsze z nich używa tylko standardowego przesunięcia.

Sprawdziłem katalogi dla tych dwóch nazw stref czasowych. Oboje są tam i wyglądają tak samo:

db=# SELECT * FROM pg_timezone_names WHERE name IN ('CET', 'Europe/Vienna');
     name      | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
 Europe/Vienna | CEST   | 02:00:00   | t
 CET           | CEST   | 02:00:00   | t

SprawdziłemPodręcznik PostgreSQL o strefach czasowych:

PostgreSQL umożliwia określenie stref czasowych w trzech różnych formach:

Pełna nazwa strefy czasowej, na przykład America / New_York. Rozpoznane nazwy stref czasowych są wymienione w widoku pg_timezone_names (patrz Rozdział 45.67). W tym celu PostgreSQL wykorzystuje powszechnie używane dane strefy czasowej strefy, dlatego te same nazwy są rozpoznawane przez wiele innych programów.

Skrót strefy czasowej, na przykład PST.Taka specyfikacja definiuje jedynie określone przesunięcie od UTC, w przeciwieństwie do nazw stref czasowych, które mogą oznaczać również zestaw reguł daty zmiany czasu letniego. Uznane skróty są wymienione w widoku pg_timezone_abbrevs (patrz Rozdział 45.66). Nie można ustawić parametrów konfiguracyjnych strefy czasowej lub log_timezone na skrót strefy czasowej, ale można użyć skrótów w wartościach wejściowych daty / czasu oraz u operatora AT TIME ZONE.

Bold Emphasis mine.

Więc dlaczego różnica?

Moje ustawienia (więcej szczegółów dodano)

PostgreSQL 9.1.4 na Debian Squeeze (standardowe squeeze-backporty zhttp://backports.debian.org/debian-backports)

Lokalnytimezone ustawienie domyślne ustawień regionalnych systemude_AT.UTF-8, ale nie powinien mieć znaczenia dla przykładu.

SELECT version();
                                                version
-------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.4 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 64-bit

SHOW timezone_abbreviations;

 timezone_abbreviations
------------------------
 Default

.. które (zakładam) ładuje skróty z tego pliku: /usr/share/postgresql/9.1/timezonesets/Default

Brakuje mi nazwy strefy czasowejCET pochodzi z. Ale oczywiście jest tam w moich instalacjach. ZAszybki test na sqlfiddle pokazuje ten sam wynik.

Testowałem na dwóch różnych serwerach o podobnej konfiguracji. Również z PostgreSQL 8.4. Znaleziono „CET” jako strefę czasowąimię wpg_timezone_names w każdym z nich.

questionAnswers(2)

yourAnswerToTheQuestion