Tại sao bạn không lưu trữ UTC trong DB ngay từ đầu? Trong hầu hết các trường hợp, DateTime
nên được lưu trữ trong UTC, vì nó thường đề cập đến một thời điểm. Điều này đúng với bất kỳ điều gì đề cập đến thời gian theo nghĩa vật lý và bất kỳ điều gì giả định rằng thời gian là đơn điệu, tăng dần và duy nhất, không điều nào đúng với hầu hết thời gian địa phương.
Đôi khi, việc sử dụng giờ địa phương cũng có ý nghĩa:giả sử mỗi ngày có một chuyến xe buýt khởi hành lúc 9 giờ sáng. Điều này có nghĩa là 24 giờ trôi qua giữa hai sự kiện liên tiếp. Tuy nhiên, nếu múi giờ có DST, nó sẽ là khoảng 23h, tương ứng 25h mỗi năm.
Tuy nhiên, nếu bạn cần giải quyết loại dữ liệu này, một DateTime
đơn giản không làm thủ thuật; Các quy tắc DST có thể thay đổi, múi giờ có thể thay đổi, v.v. Trong C #, các quy tắc DST sẽ được áp dụng là những quy tắc hiện tại hợp lệ, ngay cả khi ngày là 'lịch sử'. Số học ngày tháng với các ngày lịch sử do đó có thể tàn phá. Nếu bạn thực sự cần phải đối phó với điều này, ít nhất, bạn nên lưu trữ which múi giờ theo thời gian (không chỉ chênh lệch hoặc thậm chí chỉ là isLocal
cờ).
Lưu trữ thông tin dạng văn bản trong cơ sở dữ liệu có thể được lưu trữ nhị phân dường như không mấy khả quan đối với tôi, và cũng không thay đổi giá trị trong một số lớp giữa. Cái cũ không hiệu quả và mắc phải các đặc thù đã đề cập trước đó về giờ địa phương, vấn đề sau chỉ có vấn đề thứ 2.
BTW, để thực hiện điều này, bạn có thể trang trí thuộc tính bằng [BsonDateTimeOptions(Kind=DateTimeKind.Local)]
, điều này sẽ thực hiện chuyển đổi cho bạn, nhưng tất nhiên cũng gặp phải các vấn đề tương tự.