Hned poté, co jsem to zveřejnil, jsem spustil další dotaz, abych prověřil podezření:
SELECT * FROM pg_timezone_abbrevs
WHERE abbrev IN ('CEST', 'CET');
abbrev | utc_offset | is_dst
--------+------------+--------
CEST | 02:00:00 | t
CET | 01:00:00 | f
Jak se ukazuje, existuje také zkratka časového pásma s názvem CET
(což dává smysl, "SEČ" je zkratka). A zdá se, že PostgreSQL vybírá zkratku přes celé jméno. Takže, i když jsem našel CET
v časovém pásmu jména , výraz '2012-01-18 1:0 CET'::timestamptz je interpretován podle mírně odlišných pravidel pro zkratky časových pásem .
SELECT '2012-01-18 1:0 CEST'::timestamptz(0)
,'2012-01-18 1:0 CET'::timestamptz(0)
,'2012-01-18 1:0 Europe/Vienna'::timestamptz(0);
timestamptz | timestamptz | timestamptz
------------------------+------------------------+------------------------
2012-01-18 00:00:00+01 | 2012-01-18 01:00:00+01 | 2012-01-18 01:00:00+01
SELECT '2012-08-18 1:0 CEST'::timestamptz(0)
,'2012-08-18 1:0 CET'::timestamptz(0)
,'2012-08-18 1:0 Europe/Vienna'::timestamptz(0);
timestamptz | timestamptz | timestamptz
------------------------+------------------------+------------------------
2012-08-18 01:00:00+02 | 2012-08-18 02:00:00+02 | 2012-08-18 01:00:00+02
Našel jsem 10 případů zkratek časových pásem v časovém pásmu jména a nechápou, proč tam jsou. Jaký je účel?
Mezi nimi je časový posun (utc_offset
) nesouhlasí ve čtyřech případech kvůli nastavení DST:
SELECT n.*, a.*
FROM pg_timezone_names n
JOIN pg_timezone_abbrevs a ON a.abbrev = n.name
WHERE n.utc_offset <> a.utc_offset;
name | abbrev | utc_offset | is_dst | abbrev | utc_offset | is_dst
------+--------+------------+--------+--------+------------+--------
CET | CEST | 02:00:00 | t | CET | 01:00:00 | f
EET | EEST | 03:00:00 | t | EET | 02:00:00 | f
MET | MEST | 02:00:00 | t | MET | 01:00:00 | f
WET | WEST | 01:00:00 | t | WET | 00:00:00 | f
V těchto případech mohou být lidé oklamáni (jako jsem byl já), když vyhledávají jméno tz a nalezení časového posunu, který ve skutečnosti není aplikován. To je nešťastný návrh – když ne chyba, tak alespoň chyba v dokumentaci .
V manuálu jsem nenašel nic o tom, jak jsou nejasnosti mezi názvy časových pásem a zkratky jsou vyřešeny. Je zřejmé, že přednost mají zkratky.
Příloha B.1. Interpretace vstupu data/času zmiňuje vyhledávání zkratek časového pásma, ale zůstává nejasné jak časové pásmo názvy jsou identifikovány a který z nich má prioritu v případě nejednoznačného tokenu.
Pokud je token textový řetězec, porovnejte s možnými řetězci:
Proveďte binární vyhledávání v tabulce pro token jako zkratku časového pásma.
No, v této větě je lehký náznak, že zkratky jsou na prvním místě, ale nic definitivního. Je zde také sloupec abbrev
v obou tabulkách pg_timezone_names
a pg_timezone_abbrevs
...