właściwe sposobem nie jest używanie time with time zone
(zwróć uwagę na spację między time
i zone
), ponieważ jest zepsute z założenia. Jest w standardzie SQL, więc Postgres obsługuje ten typ - ale odradza nie z niego korzystać. Więcej w tej powiązanej odpowiedzi:
Ponieważ masz problemy z DST
, timetz
(imię i nazwisko) to szczególnie zły wybór. Jest źle przygotowany do radzenia sobie z czasem letnim. Nie da się stwierdzić, czy 8:00:00
jest zimą lub latem.
Użyj timestamp with time zone
(timstamptz
)
zamiast. Zawsze możesz wyrzucić część daty. Po prostu użyj start_time::time
aby uzyskać lokalne czas od timestamptz
. Lub użyj AT TIME ZONE
transponować do Twojej strefy czasowej.
Ogólnie, aby automatycznie brać pod uwagę czas letni , użyj nazwy strefy czasowej zamiast skrótu strefy czasowej. Więcej wyjaśnień w tym powiązanym pytaniu i odpowiedzi:
W swoim konkretnym przypadku prawdopodobnie możesz użyć America/Los_Angeles
(przykład z timestamptz
):
INSERT INTO mytable(start_time, end_time)
VALUES
('1970-01-01 08:00:00 America/Los_Angeles'
, '1970-01-01 18:00:00 America/Los_Angeles')
Znalazłem to, sprawdzając:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Podstawy obsługi stref czasowych: