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ờ: