2009-02-23 49 views
79

Liệu .Net DateTime có chứa thông tin về múi giờ nơi nó được tạo không?Nhận múi giờ từ DateTime

Tôi có thư viện phân tích DateTime từ định dạng có "+ zz" ở cuối và trong khi phân tích cú pháp chính xác và điều chỉnh giờ địa phương, tôi cần nhận múi giờ cụ thể từ đối tượng DateTime.

Điều này có thể thực hiện được không? Tất cả những gì tôi có thể thấy là DateTime.Kind, chỉ định thời gian là cục bộ hoặc UTC.

Trả lời

112

Chính thời gian ngày không chứa thông tin múi giờ thực. Nó có thể biết nếu đó là UTC hoặc địa phương, nhưng không biết địa phương thực sự có ý nghĩa gì.

DateTimeOffset có phần tốt hơn - về cơ bản là thời gian UTC và chênh lệch. Tuy nhiên, điều đó vẫn chưa thực sự đủ để xác định múi giờ, vì nhiều múi giờ khác nhau có thể có cùng độ lệch tại bất kỳ thời điểm nào. Điều này nghe có vẻ như nó có thể là tốt, đủ cho bạn mặc dù, như tất cả các bạn đã có để làm việc với khi phân tích ngày/thời gian là bù đắp.

Hỗ trợ cho các múi giờ của .NET 3.5 tốt hơn rất nhiều, nhưng tôi thực sự muốn thấy một "ZonedDateTime" chuẩn hoặc một cái gì đó tương tự - thời gian UTC và múi giờ thực tế. Thật dễ dàng để xây dựng của riêng bạn, nhưng nó sẽ được tốt đẹp để xem nó trong các thư viện chuẩn.

CHỈNH SỬA: Gần bốn năm sau, tôi khuyên bạn nên sử dụng Noda Time có tập hợp ngày/giờ phong phú hơn. Mặc dù vậy, tôi bị thiên vị, là tác giả chính của Noda Time :)

+2

Yêu cầu PublicDomain trên CodePlex thực hiện điều này cho bạn. – Cheeso

+0

Một TimeZone enum trong BCL sẽ là tốt đẹp nếu các múi giờ trên thế giới là tĩnh và không thay đổi. – jlafay

+1

@jlafay: Tuy nhiên, chúng thay đổi - ví dụ như nhiều múi giờ đã được thêm vào Windows chỉ trong năm ngoái. –

29

số

Một nhà phát triển có trách nhiệm theo dõi các thông tin múi giờ liên kết với một giá trị DateTime qua một số cơ chế bên ngoài.

Trích dẫn từ bài viết xuất sắc here. A phải đọc cho mọi nhà phát triển .Net.

Vì vậy, lời khuyên của tôi là viết một lớp vỏ bọc nhỏ phù hợp với nhu cầu của bạn.

2

Bạn có thể sử dụng TimeZoneInfo lớp

Lớp TimeZone nhận múi giờ địa phương, và có thể chuyển đổi giữa lần Coordinated Universal Time (UTC) và giờ địa phương. Một đối tượng TimeZoneInfo có thể đại diện cho bất kỳ múi giờ nào và các phương thức của lớp TimeZoneInfo có thể được sử dụng để chuyển đổi thời gian trong một múi giờ thành thời gian tương ứng trong bất kỳ múi giờ nào khác. Các thành viên của lớp TimeZoneInfo hỗ trợ các hoạt động sau đây:

  1. Lấy ra một múi giờ mà đã được xác định bởi các điều hành hệ thống.

  2. Liệt kê các múi giờ khả dụng trên hệ thống.

  3. Thời gian chuyển đổi giữa các múi giờ khác nhau.

  4. Tạo múi giờ mới chưa được hệ điều hành xác định.

    Nối tiếp múi giờ để truy xuất sau.

+1

... nhưng, được cung cấp một DateTime, vẫn không có cách nào để sử dụng TimeZoneInfo để xác định TimeZone của DateTime, theo hiểu biết của tôi. –

+1

có Jon Skeet đúng về điều đó – Shekhar

Các vấn đề liên quan