Nguồn chính của dữ liệu để chuyển đổi giữa các định danh múi giờ của Windows và IANA là windowsZones.xml
tệp, được phân phối như một phần của dự án Unicode CLDR . Phiên bản dev mới nhất có thể được tìm thấy ở đây .
Tuy nhiên , CLDR chỉ được phát hành hai lần mỗi năm. Điều này, cùng với nhịp điệu định kỳ của các bản cập nhật Windows và các bản cập nhật bất thường của cơ sở dữ liệu múi giờ IANA, khiến việc sử dụng trực tiếp dữ liệu CLDR trở nên phức tạp. Hãy nhớ rằng chính các thay đổi múi giờ được thực hiện theo ý thích của các chính phủ khác nhau trên thế giới và không phải tất cả các thay đổi đều được thực hiện với thông báo đầy đủ để đưa nó vào các chu kỳ phát hành này trước ngày có hiệu lực tương ứng.
Có một vài trường hợp cạnh khác cần được xử lý mà không được CLDR bảo vệ nghiêm ngặt và những trường hợp mới thỉnh thoảng xuất hiện. Do đó, tôi đã gói gọn sự phức tạp của giải pháp vào thư viện vi mô TimeZoneConverter , có thể được cài đặt từ Nuget.
Sử dụng thư viện này là đơn giản. Dưới đây là một số ví dụ về chuyển đổi:
string tz = TZConvert.IanaToWindows("America/New_York");
// Result: "Eastern Standard Time"
string tz = TZConvert.WindowsToIana("Eastern Standard Time");
// result: "America/New_York"
string tz = TZConvert.WindowsToIana("Eastern Standard Time", "CA");
// result: "America/Toronto"
Có nhiều ví dụ trên trang web của dự án .
Điều quan trọng là phải nhận ra rằng trong khi múi giờ IANA có thể được ánh xạ tới một múi giờ Windows duy nhất, thì điều ngược lại là không đúng. Một múi giờ Windows duy nhất có thể được ánh xạ tới nhiều múi giờ IANA. Điều này có thể được nhìn thấy trong các ví dụ trên, nơi Eastern Standard Time
được ánh xạ tới cả hai America/New_York
và America/Toronto
. TimeZoneConverter sẽ phân phối cái mà CLDR đánh dấu "001"
, được gọi là "khu vực vàng", trừ khi bạn cung cấp cụ thể mã quốc gia và có một trận đấu cho một khu vực khác ở quốc gia đó.
Lưu ý: Câu trả lời này đã phát triển qua nhiều năm, vì vậy các bình luận bên dưới có thể hoặc không thể áp dụng cho bản sửa đổi hiện tại. Xem lại lịch sử chỉnh sửa để biết chi tiết. Cảm ơn.
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
sẽ choAsia/Calcutta
nóAsia/Kolkata
. có vẻ nhưTzdbDateTimeZoneSource
chứa các giá trị cũ.