Tôi chỉ tìm thấy câu hỏi chưa được trả lời cũ này, vì vậy tôi nghĩ nên thử nghiệm nó.
Tóm lại - phương pháp này có hợp lệ/an toàn không?
Tất cả phụ thuộc vào những gì bạn dự định làm với chúng.
Nếu bạn chỉ sử dụng nó trong mã phía máy chủ, thì có. Bạn chỉ cần lưu trữ Id
múi giờ và hiển thị người dùng tương ứng DisplayName
. FindSystemTimeZoneById
và GetSystemTimeZones
hoàn toàn hợp lệ cho việc này.
Hãy nhớ rằng trong khi giá trị Id
luôn giống nhau - thuộc tính DisplayName
sẽ khác nhau dựa trên ngôn ngữ của hệ điều hành Windows mà bạn đang chạy mã. Việc triển khai là không phải là nhận thức về văn hóa, do đó, chỉ cần đặt một nền văn bản đích khác trong .Net sẽ không thay đổi chuỗi DisplayName
.
Các bản ghi trong cơ sở dữ liệu múi giờ Microsoft Windows là hợp lý ổn định và được cập nhật qua Windows Update. Một số thông tin của thông tin đến từ sổ đăng ký, nhưng các chuỗi tài nguyên được bản địa hóa đến từ tzres.dll
. Tất nhiên, tất cả những điều đó bị ẩn khỏi bạn bởi TimeZoneInfo
và các lớp học liên quan.
Tuy nhiên, nếu bạn đang chuyển các múi giờ này Id
giá trị cho các hệ thống khác - hãy cẩn thận. Có một số biến thể với các phiên bản trước của Windows. Ví dụ, tôi biết rằng tên hiển thị được sử dụng để tất cả nói "GMT" trong họ, và bây giờ chính xác hơn nói "UTC". Giá trị Id
giống nhau, nhưng ai biết chính xác những gì khác không nhất quán. Đặc biệt nếu máy tính mục tiêu không nhận được cùng một bộ Windows Updates mà bạn có. Nhân tiện - các bản cập nhật được công bố here.
Bạn cũng nên biết một vài điều về cơ sở dữ liệu múi giờ Windows:
Nó không có khả năng đại diện cho hơn hai chuyển DST mỗi năm dương lịch. Ví dụ: in 2010, Cairo, Egypt had four transitions. Microsoft đã phát hành a hotfix, nhưng điều đó chỉ thực hiện một sửa đổi thỏa hiệp, chứ không phải chính xác về lịch sử. Có những khu vực khác có những thay đổi lịch sử như thế này mà không thể được đại diện đúng.
Một số thứ đã thay đổi giữa Windows XP/2003 và Vista/2008. Có một số thông tin thực sự tốt về điều này here, cùng với rất nhiều chi tiết về cách đăng ký được sử dụng.
Microsoft là chỉ trình phát chính với cơ sở dữ liệu múi giờ của riêng họ. Phần còn lại của thế giới sử dụng số IANA/Olson database. Điều này dẫn đến các vấn đề về khả năng tương tác. Tôi có một đăng ký phong nha về điều này trong the timezone tag wiki.
Bạn cũng nên biết rằng TimeZoneInfo
được gắn bó chặt chẽ với DateTime
và DateTimeOffset
lớp. Đây là những thiết lập riêng của họ về quirks. DateTimeOffset
có thể sử dụng được một chút, nhưng DateTime
được sử dụng với sắc thái. Đọc:
Một xa tốt hơn giải pháp cho ngày và thời gian trong Net là sử dụng NodaTime. Thư viện này triển khai cả hai cơ sở dữ liệu múi giờ, bao gồm cả ánh xạ CLDR giữa chúng. Nó cũng cung cấp một API an toàn hơn nhiều, không cho phép bạn gặp rắc rối. Có thể mất một chút học lại, nhưng trước khi bạn biết, bạn sẽ sử dụng các lớp như LocalDateTime
, ZonedDateTime
, OffsetDateTime
và Instant
.
Bạn vẫn gặp sự cố rằng cơ sở dữ liệu múi giờ được cập nhật thường xuyên, vì chúng tôi để nguyên tắc chấm công cho các chính trị gia. Nhưng the TZDB folks làm một công việc khá tốt để giữ cơ sở dữ liệu lịch sử chính xác và cung cấp bí danh/liên kết khi tên vùng thay đổi. Bạn có thể xem danh sách tên tz here.
Ngoài ra, nếu bạn đi với NodaTime, bạn có thể chọn gắn bó với bản sao TZDB được biên dịch vào bản phân phối hoặc bạn có thể gửi bản sao của riêng mình bằng ứng dụng của mình. Bạn có thể (về mặt lý thuyết) viết mã của riêng bạn để kéo xuống phiên bản mới nhất từ IANA và giữ cho ứng dụng của bạn được cập nhật - tất cả mà không dựa vào hệ điều hành máy chủ.
Bạn đã xem ['DateTimeOffset'] (http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx) chưa? Hoặc ['NodaTime'] (http://code.google.com/p/noda-time/)? – Oded
Liên quan: http://stackoverflow.com/q/2532729/1583 – Oded
@Oded Vấn đề với DateTimeOffset là nó không phải là Day Light Savings biết – Paparazzi