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: