แหล่งที่มาหลักของข้อมูลสำหรับการแปลงระหว่าง Windows และตัวระบุเขตเวลาของ IANA คือwindowsZones.xml
ไฟล์ซึ่งถูกแจกจ่ายเป็นส่วนหนึ่งของโครงการUnicode CLDR รุ่น dev ล่าสุดสามารถพบได้ที่นี่
อย่างไรก็ตาม CLDR ถูกปล่อยออกปีละสองครั้งเท่านั้น สิ่งนี้พร้อมกับจังหวะการปรับปรุงของ Windows เป็นระยะและการปรับปรุงฐานข้อมูลเขตเวลาของ IANA อย่างไม่สม่ำเสมอทำให้มีความซับซ้อนในการใช้ข้อมูล CLDR โดยตรง โปรดทราบว่าการเปลี่ยนแปลงเขตเวลาเกิดขึ้นในรัฐบาลต่าง ๆ ของโลกและไม่มีการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นเมื่อมีการแจ้งเตือนอย่างเพียงพอที่จะทำให้มันเข้าสู่วงจรการเปิดตัวเหล่านี้ก่อนวันที่มีผลบังคับใช้
มีอีกสองสามกรณีที่จำเป็นต้องได้รับการจัดการที่ไม่ได้รับการคุ้มครองอย่างเข้มงวดจาก CLDR และมีกรณีใหม่ ๆ เกิดขึ้นเป็นครั้งคราว ดังนั้นฉันได้ห่อหุ้มความซับซ้อนของการแก้ปัญหาไว้ในห้องสมุดขนาดเล็กTimeZoneConverterซึ่งสามารถติดตั้งได้จาก Nuget
การใช้ห้องสมุดนี้เป็นเรื่องง่าย นี่คือตัวอย่างของการแปลง:
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"
มีตัวอย่างอื่น ๆบนเว็บไซต์ของโครงการ
สิ่งสำคัญคือต้องทราบว่าในขณะที่เขตเวลาของ IANA สามารถแมปกับเขตเวลา Windows เดียวการย้อนกลับไม่เป็นความจริง เขตเวลา Windows เดียวอาจถูกแมปกับเขตเวลาของ IANA มากกว่าหนึ่งเขต นี้สามารถเห็นได้ในตัวอย่างข้างต้นที่Eastern Standard Time
ถูกแมปไปทั้งสองและAmerica/New_York
America/Toronto
TimeZoneConverter จะส่งมอบที่ CLDR ทำเครื่องหมายด้วย"001"
หรือที่เรียกว่า "โซนทองคำ" ยกเว้นว่าคุณระบุรหัสประเทศโดยเฉพาะและมีการจับคู่สำหรับโซนที่แตกต่างกันในประเทศนั้น ๆ
หมายเหตุ: คำตอบนี้มีวิวัฒนาการมาหลายปีดังนั้นความคิดเห็นด้านล่างอาจมีหรือไม่มีผลกับการแก้ไขปัจจุบัน ตรวจสอบประวัติการแก้ไขเพื่อดูรายละเอียด ขอบคุณ
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
ให้มันควรจะเป็นAsia/Calcutta
Asia/Kolkata
ดูเหมือนว่าTzdbDateTimeZoneSource
มีค่าเก่า