Niestety PostgreSQL nie oferuje typu danych strefy czasowej, więc prawdopodobnie powinieneś użyć text .
interval na pierwszy rzut oka wydaje się logiczną opcją i jest odpowiednie do niektórych zastosowań. Jednak nie uwzględnia czasu letniego ani faktu, że różne regiony w tym samym przesunięciu UTC mają różne reguły czasu letniego.
Nie ma mapowania 1:1 z przesunięcia czasu UTC z powrotem do strefy czasowej.
Na przykład strefa czasowa Australia/Sydney (Nowa Południowa Walia) to UTC+10 (EST ) lub UTC+11 (EDT ) w czasie letnim. Tak, to ten sam akronim EST używane przez USA; akronimy stref czasowych nie są unikalne w bazie danych tzdata, dlatego Pg ma timezone_abbreviations ustawienie. Co gorsza, Brisbane (Queensland) znajduje się na prawie tej samej długości geograficznej i jest w UTC+10 EST ... ale nie ma czasu letniego, więc czasami jest na poziomie -1 przesunięcie do Nowej Południowej Walii podczas czasu letniego w NSW.
(Aktualizacja :Niedawno Australia przyjęła A prefiks, więc używa AEST jako jego wschodnie stany akronim TZ, ale EST i WST pozostają w powszechnym użyciu).
Dużo się mylisz?
Jeśli wszystko, co musisz przechowywać, to przesunięcie UTC następnie interval jest odpowiednie. Jeśli chcesz zapisać strefę czasową , zapisz go jako text . W tej chwili trudno jest sprawdzić poprawność i przekonwertować na przesunięcie strefy czasowej, ale przynajmniej radzi sobie z czasem letnim.