За съжаление PostgreSQL не предлага тип данни за часова зона, така че вероятно трябва да използвате text
.
interval
на пръв поглед изглежда като логична опция и е подходящи за някои употреби. Той обаче не взема предвид лятното часово време, нито пък взема предвид факта, че различните региони в едно и също UTC отместване имат различни правила за лятно часово време.
Няма съпоставяне 1:1 от UTC отместването обратно към часовата зона.
Например часовата зона за Australia/Sydney
(Нов Южен Уелс) е UTC+10
(EST
), или UTC+11
(EDT
) по време на лятното часово време. Да, това е същото съкращение EST
които САЩ използват; акронимите на часовите зони не са уникални в базата данни tzdata, поради което Pg има timezone_abbreviations
настройка. Още по-лошо, Бризбейн (Куинсланд) е на почти същата дължина и е в UTC+10 EST
... но няма лятно часово време, така че понякога е на -1
изместване към Нов Южен Уелс по време на лятното часово време на NSW.
(Актуализиране :Съвсем наскоро Австралия прие A
префикс, така че използва AEST
като акроним TZ на източните щати, но EST
и WST
остават в обща употреба).
Много ли обърквате?
Ако всичко, което трябва да съхраните, е UTC отместване след това interval
е подходящо. Ако искате да съхраните часова зона , запазете го като text
. В момента е трудно да се валидира и да се конвертира към отместване на часовата зона, но поне се справя с DST.