O adequado maneira é não usar
time with time zone
(observe o espaço entre time
e zone
), uma vez que está quebrado por design. Está no padrão SQL, então o Postgres suporta o tipo - mas aconselha não para usá-lo. Mais nesta resposta relacionada:Como você está tendo problemas com o DST ,
timetz
(nome curto) é uma escolha particularmente ruim. Está mal equipado para lidar com o horário de verão. É impossível saber se 8:00:00
é no inverno ou no verão. Use
timestamp with time zone
(timstamptz
)
em vez de. Você sempre pode descartar a parte da data. Basta usar start_time::time
para obter o local hora de um timestamptz
. Ou use AT TIME ZONE
para transpor para o seu fuso horário. Geralmente, para considerar o horário de verão automaticamente , use um nome de fuso horário em vez de uma abreviação de fuso horário. Mais explicações nesta pergunta e resposta relacionadas:
No seu caso particular, você provavelmente poderia usar
America/Los_Angeles
(exemplo com 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')
Encontrei isso verificando:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Noções básicas sobre o manuseio de fuso horário: