Nomes de fuso horário com propriedades idênticas geram resultados diferentes quando aplicados ao registro de data e hora

Acabei de passar uma hora em desespero com a discrepância nesses resultados dessas duas expressões:


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

Obviamente, a segunda expressão deduz duas horas de acordo com as regras de horário de verão, onde a primeira usa apenas o deslocamento padrão.

Eu verifiquei os catálogos para esses dois nomes de fuso horário. Eles estão lá e parecem iguais:

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

Eu consultei oManual do PostgreSQL sobre fusos horários:

O PostgreSQL permite especificar fusos horários em três formas diferentes:

Um nome de fuso horário completo, por exemplo, América / New_York. Os nomes dos fusos horários reconhecidos são listados na visão pg_timezone_names (veja Seção 45.67). O PostgreSQL usa os dados do fuso horário zoneinfo amplamente utilizados para essa finalidade, portanto os mesmos nomes também são reconhecidos por muitos outros softwares.

Uma abreviação de fuso horário, por exemplo, PST.Tal especificação simplesmente define um deslocamento particular de UTC, em contraste com nomes de fuso horário completo, o que pode implicar também um conjunto de regras de data de transição de horário de verão. As abreviaturas reconhecidas estão listadas na visão pg_timezone_abbrevs (veja Seção 45.66). Não é possível definir os parâmetros de configuração timezone ou log_timezone como uma abreviação de fuso horário, mas é possível usar abreviações em valores de entrada de data / hora e com o operador AT TIME ZONE.

Minha ênfase é Bold.

Então, por que a diferença?

Minha configuração (mais detalhes adicionados)

PostgreSQL 9.1.4 no Debian Squeeze (squeeze-backports padrão dehttp://backports.debian.org/debian-backports)

Localtimezone definindo padrões para a localidade do sistemade_AT.UTF-8, mas deve ser irrelevante para o exemplo.

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

.. que (eu suponho) carrega abreviações deste arquivo: /usr/share/postgresql/9.1/timezonesets/Default

Eu estou em uma perda onde o nome do fuso horárioCET vem de. Mas obviamente está lá nas minhas instalações. UMAteste rápido em sqlfiddle mostra o mesmo resultado.

Eu testei em dois servidores diferentes com configuração semelhante. Também com o PostgreSQL 8.4. Encontrado 'CET' como fuso horárionome empg_timezone_names em todos eles.

questionAnswers(2)

yourAnswerToTheQuestion