Thứ nhất, nó kiểm tra xem Kind
của DateTime
được biết là UTC chưa. Nếu vậy, nó trả về cùng một giá trị.
Nếu không, nó được giả định là giờ địa phương - đó là cục bộ cho máy tính đang chạy và đặc biệt trong múi giờ mà máy tính đang sử dụng khi một số thuộc tính riêng được khởi chạy lần đầu tiên. Điều đó có nghĩa là nếu bạn thay đổi múi giờ sau ứng dụng của bạn đã được bắt đầu, có nhiều khả năng nó sẽ vẫn sử dụng ứng dụng cũ.
Múi giờ chứa đủ thông tin để chuyển đổi giờ địa phương thành thời gian UTC hoặc ngược lại, mặc dù có những thời điểm không rõ ràng hoặc không hợp lệ. (Có những lúc địa phương xảy ra hai lần, và thời gian địa phương mà không bao giờ xảy ra do tiết kiệm thời gian ban ngày.) Các quy tắc để xử lý những trường hợp được quy định tại the documentation:
Nếu ngày và thời gian giá trị ví dụ là một mơ hồ thời gian, phương pháp này giả định rằng nó là một thời gian tiêu chuẩn.(An thời gian mơ hồ là một trong đó có thể ánh xạ thời gian chuẩn hoặc đến thời gian tiết kiệm ánh sáng ban ngày theo giờ địa phương là ) thời gian từ chênh lệch UTC của múi giờ địa phương thành trả lại UTC. (Một thời gian không hợp lệ là một rằng không tồn tại vì các ứng dụng tiết kiệm ánh sáng ban ngày thời gian quy tắc điều chỉnh.)
Các giá trị trả về sẽ có một Kind
của DateTimeKind.Utc
, vì vậy nếu bạn gọi ToUniveralTime
trên rằng nó đã giành không áp dụng bù đắp một lần nữa. (Đây là một cải tiến lớn trên .NET 1.1!)
Nếu bạn muốn có múi giờ phi địa phương, bạn nên sử dụng TimeZoneInfo
được giới thiệu trong .NET 3.5 (có các giải pháp hacky cho các phiên bản cũ hơn, nhưng chúng không hay). Để thể hiện ngay lập tức, bạn nên cân nhắc sử dụng DateTimeOffset
được giới thiệu trong .NET 2.0SP1, .NET3.0SP1 và .NET 3.5. Tuy nhiên, điều đó vẫn không có múi giờ thực sự được liên kết với nó - chỉ là một khoản bù trừ từ UTC. Điều đó có nghĩa là bạn không biết thời gian địa phương sẽ là một giờ sau đó, ví dụ - các quy tắc DST có thể khác nhau giữa các múi giờ xảy ra để sử dụng cùng một bù đắp cho tức thời cụ thể đó. TimeZoneInfo
được thiết kế để đưa các quy tắc lịch sử và tương lai vào tài khoản, thay vì TimeZone
có phần đơn giản.
Về cơ bản, hỗ trợ trong .NET 3.5 tốt hơn rất nhiều so với trước đây, nhưng vẫn để lại một số thứ cần thiết cho số học lịch thích hợp. Bất cứ ai ưa thích porting Joda Time để .NET? ;)
Nguồn
2009-07-29 16:21:47
No. Không quan tâm đến thời gian hiện tại. Nó quan tâm đến múi giờ của hệ thống địa phương. –
Bạn không muốn * luôn * lưu trữ thông tin liên quan đến thời gian trong UTC. Nó hoàn toàn phụ thuộc vào thông tin đó thực sự là gì. Instants trong thời gian thường có thể được đại diện trong UTC, nhưng không phải tất cả mọi thứ là ngay lập tức. Ví dụ, tôi đang trên chuyến tàu 17:18 từ Paddington. Lưu ý là "17:18 Châu Âu/Luân Đôn" thay vì "16:18 UTC" - bởi vì khi đồng hồ quay trở lại, thời gian * cục bộ vẫn giữ nguyên. –
Bạn có thể nói rằng tôi làm việc trên một sản phẩm liên quan đến lịch? ;) –