Když uložíte timestamp with time zone
(timestamptz
) je převeden na UTC pro uložení v DB. Po načtení se převede na aktuální časové pásmo klienta, nikoli na časové pásmo, ve kterém byl původně. Jde v podstatě o časový bod.
K dispozici je také timestamp without time zone
(timestamp
). Toto není předmětem konverze, ale není noste s sebou časové razítko. Pokud uložíte timestamp
s časovým pásmem klienta nastaveným na UTC a poté jej načtěte, když je časové pásmo klienta '+08:00', získáte stejnou hodnotu. To je polovina toho, co chcete, protože zachovává nezpracovanou časovou hodnotu.
Názvy a chování jsou hrozné a matoucí, ale jsou nastaveny standardem SQL.
Časové pásmo musíte uložit samostatně, chcete-li zaznamenat bod v čase v určitém časovém pásmu. Doporučuji jej uložit jako INTERVAL
s CHECK
omezení, které jej omezuje na colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Tato definice odmítá -12:00 a přijímá +12:00; Nejsem si úplně jistý, že je to správné, tak to zkontrolujte.
Můžete uložit timestamp
místního času v daném časovém pásmu (co bych asi udělal já), nebo uložit timestamptz
času UTC, kdy k události došlo, plus posun, který vám umožní převést jej na místní čas.
Obojí bude fungovat dobře pro JDBC. U JPA bude záležet na tom, jak dobře váš poskytovatel rozumí a mapuje typy intervalů. V ideálním případě chcete ve své entitě přechodně generované pole, které rekonstruuje požadovanou instanci Kalendáře pomocí timestamp
a interval
uloženy v databázi.