tepat caranya adalah dengan tidak menggunakan time with time zone
(perhatikan jarak antara time
dan zone
) sama sekali, karena rusak oleh desain. Itu dalam standar SQL, jadi Postgres mendukung jenisnya - tetapi menyarankan tidak untuk menggunakannya. Lebih banyak dalam jawaban terkait ini:
Karena Anda mengalami masalah dengan DST
, time
(nama pendek) adalah pilihan yang sangat buruk. Ini tidak dilengkapi dengan baik untuk menangani DST. Tidak mungkin untuk mengetahui apakah 8:00:00
sedang musim dingin atau musim panas.
Gunakan timestamp with time zone
(timstamptz
)
alih-alih. Anda selalu dapat membuang bagian tanggal. Cukup gunakan start_time::time
untuk mendapatkan lokal waktu dari timestamptz
. Atau gunakan AT TIME ZONE
untuk mentranspos ke zona waktu Anda.
Umumnya, untuk memperhitungkan DST secara otomatis , gunakan nama zona waktu bukan singkatan zona waktu. Penjelasan lebih lanjut dalam pertanyaan &jawaban terkait ini:
Dalam kasus khusus Anda, Anda mungkin dapat menggunakan America/Los_Angeles
(contoh dengan 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')
Saya menemukan ini dengan memeriksa:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Dasar-dasar tentang penanganan zona waktu: