Zeitzonennamen mit identischen Eigenschaften führen zu unterschiedlichen Ergebnissen, wenn sie auf einen Zeitstempel angewendet werden

Ich habe gerade eine Stunde in der Verzweiflung mit der Diskrepanz in diesen Ergebnissen dieser zwei Ausdrücke verbracht:


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

Offensichtlich zieht der zweite Ausdruck zwei Stunden gemäß den DST-Regeln ab, wobei der erste nur den Standardoffset verwendet.

Ich habe die Kataloge nach diesen beiden Zeitzonennamen durchsucht. Sie sind beide da und sehen genauso aus:

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

Ich habe das konsultiertPostgreSQL-Handbuch über Zeitzonen:

Mit PostgreSQL können Sie Zeitzonen in drei verschiedenen Formen angeben:

Ein vollständiger Name der Zeitzone, z. B. America / New_York. Die erkannten Zeitzonennamen werden in der Ansicht pg_timezone_names aufgelistet (siehe Abschnitt 45.67). PostgreSQL verwendet zu diesem Zweck die weit verbreiteten Zeitzonendaten zoneinfo, sodass die gleichen Namen auch von vielen anderen Programmen erkannt werden.

Eine Zeitzonenabkürzung, zum Beispiel PST.Eine solche Spezifikation definiert lediglich einen bestimmten Versatz von UTC, im Gegensatz zu Namen von Vollzeitzonen, die auch einen Satz von Sommerzeit-Übergangsdatenregeln implizieren können. Die erkannten Abkürzungen werden in der Ansicht pg_timezone_abbrevs aufgelistet (siehe Abschnitt 45.66). Sie können die Konfigurationsparameter timezone oder log_timezone nicht auf eine Zeitzonenabkürzung festlegen, aber Sie können Abkürzungen in Datums- / Zeit-Eingabewerten und mit dem Operator AT TIME ZONE verwenden.

Bold Emphasis Mine.

Warum also der Unterschied?

Mein Setup (weitere Details hinzugefügt)

PostgreSQL 9.1.4 unter Debian Squeeze (Standard - Squeeze - Backports vonhttp://backports.debian.org/debian-backports)

Lokaltimezone Standardmäßig wird das Gebietsschema des Systems festgelegtde_AT.UTF-8, sollte aber für das Beispiel irrelevant sein.

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

.. die (nehme ich an) Abkürzungen aus dieser Datei lädt: /usr/share/postgresql/9.1/timezonesets/Default

Ich bin ratlos, wo der Name der Zeitzone istCET kommt von. Aber offensichtlich ist es dort in meinen Installationen. EINSchnelltest auf Sqlfiddle zeigt das gleiche Ergebnis.

Ich habe auf zwei verschiedenen Servern mit ähnlichen Einstellungen getestet. Auch mit PostgreSQL 8.4. 'CET' als Zeitzone gefundenName impg_timezone_names in allen von ihnen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage