Имена часовых поясов с одинаковыми свойствами дают другой результат при применении к метке времени

Я только что провел час в отчаянии из-за расхождений в этих результатах этих двух выражений:


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

Очевидно, что второе выражение вычитает два часа в соответствии с правилами DST, где первое использует только стандартное смещение.

Я проверил каталоги для этих двух названий часовых поясов. Они оба там и выглядят одинаково:

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

Я посоветовался сРуководство PostgreSQL о часовых поясах:

PostgreSQL allows you to specify time zones in three different forms:

A full time zone name, for example America/New_York. The recognized time zone names are listed in the pg_timezone_names view (see Section 45.67). PostgreSQL uses the widely-used zoneinfo time zone data for this purpose, so the same names are also recognized by much other software.

A time zone abbreviation, for example PST. Such a specification merely defines a particular offset from UTC, in contrast to full time zone names which can imply a set of daylight savings transition-date rules as well. The recognized abbreviations are listed in the pg_timezone_abbrevs view (see Section 45.66). You cannot set the configuration parameters timezone or log_timezone to a time zone abbreviation, but you can use abbreviations in date/time input values and with the AT TIME ZONE operator.

Жирный Акцент мой.

Так почему разница?

My setup (more details added)

PostgreSQL 9.1.4 on Debian Squeeze (standard squeeze-backports from http://backports.debian.org/debian-backports)

Local timezone setting defaults to the system locale de_AT.UTF-8, but should be irrelevant for the example.

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

.. который (я предполагаю) загружает сокращения из этого файла:     /usr/share/postgresql/9.1/timezonesets/Default

Я в недоумении, где название часового поясаCET происходит от. Но, очевидно, это есть в моих установках.быстрый тест на sqlfiddle показывает тот же результат.

Я тестировал на двух разных серверах с похожей настройкой. Также с PostgreSQL 8.4. Найдено "CET" как часовой поясname вpg_timezone_names во всех них.

Ответы на вопрос(2)

Ваш ответ на вопрос