thích hợp cách là không sử dụng time with time zone (lưu ý khoảng cách giữa time và zone ) ở tất cả, vì nó bị phá vỡ bởi thiết kế. Nó nằm trong tiêu chuẩn SQL, vì vậy Postgres hỗ trợ loại - nhưng khuyên không để dùng nó. Thêm trong câu trả lời có liên quan này:
Vì bạn đang gặp sự cố với DST
, timetz (tên viết tắt) là một lựa chọn đặc biệt tồi. Nó không được trang bị đầy đủ để đối phó với DST. Không thể biết liệu 8:00:00 là vào mùa đông hoặc mùa hè.
Sử dụng timestamp with time zone (timstamptz )
thay vì. Bạn luôn có thể loại bỏ phần ngày tháng. Chỉ cần sử dụng start_time::time để có được địa phương thời gian từ một timestamptz . Hoặc sử dụng AT TIME ZONE
để chuyển sang múi giờ của bạn.
Nói chung, để tự động tính đến DST , sử dụng tên múi giờ thay vì viết tắt múi giờ. Giải thích thêm trong câu hỏi và câu trả lời liên quan này:
Trong trường hợp cụ thể của bạn, bạn có thể sử dụng America/Los_Angeles (ví dụ với 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')
Tôi đã tìm thấy điều này bằng cách kiểm tra:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Kiến thức cơ bản về xử lý múi giờ: