Den riktiga sättet är att inte använda time with time zone (notera mellanrummet mellan time och zone ) alls, eftersom den är trasig av design. Det finns i SQL-standarden, så Postgres stöder typen - men avråder inte att använda den. Mer i detta relaterade svar:
Eftersom du har problem med DST
, timetz (kort namn) är ett särskilt dåligt val. Den är dåligt rustad att hantera sommartid. Det är omöjligt att avgöra om 8:00:00 är vinter- eller sommartid.
Använd timestamp with time zone (timstamptz )
istället. Du kan alltid slänga datumdelen. Använd bara start_time::time för att få den lokala tid från en timestamptz . Eller använd AT TIME ZONE
för att överföra till din tidszon.
Generellt för att ta hänsyn till sommartid automatiskt , använd ett tidszonnamn istället för en tidszonförkortning. Mer förklaring i denna relaterade fråga och svar:
I ditt specifika fall kan du förmodligen använda America/Los_Angeles (exempel med 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')
Jag hittade detta genom att kontrollera:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Grunder om tidszonshantering: