správné způsob je nepoužívat time with time zone
(všimněte si mezery mezi time
a zone
) vůbec, protože je rozbitý designem. Je ve standardu SQL, takže Postgres typ podporuje - ale doporučuje ne používat to. Více v této související odpovědi:
Protože máte problémy s DST
, timetz
(krátké jméno) je obzvláště špatná volba. Je špatně vybaven pro řešení letního času. Není možné určit, zda 8:00:00
je v zimním nebo letním čase.
Použijte timestamp with time zone
(timstamptz
)
namísto. Část s datem můžete vždy zahodit. Jednoduše použijte start_time::time
získat místní čas z timestamptz
. Nebo použijte AT TIME ZONE
transponovat do vašeho časového pásma.
Obecně platí, že automatické zohlednění letního času , použijte název časového pásma místo zkratky časového pásma. Další vysvětlení v této související otázce a odpovědi:
Ve vašem konkrétním případě byste pravděpodobně mohli použít America/Los_Angeles
(příklad s 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')
Našel jsem to kontrolou:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Základy zpracování časových pásem: