विंडोज और आईएएनए समय क्षेत्रों के बीच अनुवाद कैसे करें?


149

जैसा कि टाइमज़ोन टैग विकी में वर्णित है , टाइम ज़ोन की दो अलग-अलग शैलियाँ हैं।

  • Microsoft द्वारा Windows और .Net TimeZoneInfoवर्ग (जब विंडोज पर चल रहा है) के साथ उपयोग के लिए प्रदान की जाती हैं जैसे कि एक मूल्य द्वारा पहचाना जाता है "Eastern Standard Time"

  • IDB द्वारा TZDB में प्रदान किए गए, और TimeZoneInfoलिनक्स या OSX पर चलने पर .NET क्लास द्वारा उपयोग किया जाता है , जैसे कि एक मूल्य द्वारा पहचाना जाता है "America/New_York"

कई इंटरनेट-आधारित एपीआई IANA टाइम ज़ोन का उपयोग करते हैं, लेकिन कई कारणों से किसी को इसे विंडोज टाइम ज़ोन आईडी, या इसके विपरीत में बदलने की आवश्यकता हो सकती है।

इसे .Net में कैसे पूरा किया जा सकता है?

जवाबों:


198

Windows और IANA समय क्षेत्र पहचानकर्ताओं के बीच रूपांतरण के लिए डेटा का प्राथमिक स्रोत windowsZones.xmlफ़ाइल है, जिसे यूनिकोड 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"

प्रोजेक्ट साइट पर अधिक उदाहरण हैं ।

यह पहचानना महत्वपूर्ण है कि जब एक आईएएनए समय क्षेत्र को एक एकल विंडोज समय क्षेत्र में मैप किया जा सकता है, तो रिवर्स सच नहीं है। एक एकल Windows समय क्षेत्र एक से अधिक IANA समय क्षेत्र के लिए मैप किया जा सकता है। यह उपरोक्त उदाहरणों में देखा जा सकता है, जहां Eastern Standard Timeदोनों को मैप किया गया है America/New_York, और America/Toronto"001"जब तक आप विशेष रूप से एक देश कोड प्रदान करते हैं और उस देश में एक अलग क्षेत्र के लिए एक मैच होता है, तब तक TimeZoneConverter सीएलडीआर के निशान के साथ वितरित करेगा , जिसे "गोल्डन ज़ोन" के रूप में जाना जाता है।

नोट: यह उत्तर वर्षों में विकसित हुआ है, इसलिए नीचे दी गई टिप्पणियाँ वर्तमान संशोधन पर लागू हो सकती हैं या नहीं। विवरण के लिए संपादित इतिहास की समीक्षा करें। धन्यवाद।


1
जब परिवर्तित इस पद्धति का उपयोग (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhiदेता है Asia/Calcuttaयह होना चाहिए Asia/Kolkata। ऐसा लगता है जैसे TzdbDateTimeZoneSourceपुराने मान शामिल हैं।
एंटो सुबाष

1
@MattJohnson का Asia/Kolkataउपयोग करते हुए IanaToWindows विधि को परिवर्तित करते हुए , यह विफल हो जाता है। लेकिन यह काम करता है Asia/Calcuttaजिसके साथ पुराना नाम है। आपने विधि को अपडेट किया है, WindowsToIanaलेकिन IanaToWindowsएक ही समस्या भी है। कुछ अन्य क्षेत्रों जो काम नहीं कर रहे हैं America/Argentina/Buenos_Aires, America/Indiana/Indianapolis, Asia/Kathmandu
एंटो सुबाष

1
@AntoJSubash - फिर से, महान अवलोकन! मैंने IanaToWindowsक्षतिपूर्ति करने के लिए विधि संपादित की है । बहुत बहुत धन्यवाद!
मैट जॉनसन-पिंट

2
@MattJohnson I दूसरा @ सररोको का अवलोकन। विहित आईडी का उपयोग करना भी var canonical = tzdbSource.CanonicalIdMap[ ianaZoneId ]; links = Enumerable.Repeat( canonical, 1 ).Concat( links );मेरे लिए चाल की तरह है।
जोहान्स रुडोल्फ

2
@sirrocco - क्षमा करें, मैंने आपकी टिप्पणी को जल्द नहीं देखा। कार्यों को अद्यतन किया। धन्यवाद!
मैट जॉनसन-पिंट

4

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मेरे पास एक उपयोग का मामला था, हालांकि मैं यहां साझा करूंगा, क्योंकि यह सबसे प्रासंगिक पोस्ट है जिसे मैंने खोजा था। मैं एक डॉक लाइनक्स कंटेनर का उपयोग करके .NET कोर ऐप विकसित कर रहा था, लेकिन एक विंडोज़ सर्वर पर तैनाती के लिए। इसलिए मुझे केवल विंडोज़ टाइमज़ोन नामों का समर्थन करने के लिए अपने डॉक लाइनर कंटेनर की आवश्यकता थी। मैंने निम्नलिखित काम करके अपना एप्लिकेशन कोड बदले बिना यह काम किया:

cp /usr/share/zoneinfo/America/Chicago "/usr/share/zoneinfo/Central Standard Time"
cp /usr/share/zoneinfo/America/New_York "/usr/share/zoneinfo/Eastern Standard Time"
cp /usr/share/zoneinfo/America/Denver "/usr/share/zoneinfo/Mountain Standard Time"
cp /usr/share/zoneinfo/America/Los_Angeles "/usr/share/zoneinfo/Pacific Standard Time"

फिर, मेरे .NET कोड में, निम्नलिखित ने बिना किसी संशोधन के काम किया: TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")


1
यह कुछ बहुत अच्छा आउट ऑफ द बॉक्स सोच है! ऐसा लगता है जैसे यह ठीक होना चाहिए, जब तक आप कुछ विशिष्ट समय क्षेत्रों को कवर कर रहे हैं। ध्यान रखें कि अमेरिका में उन चार से अधिक हैं। वर्तमान में 50 राज्यों को कवर करने के लिए, आप भी करने के लिए लिंक जोड़ने की आवश्यकता होगी America/Phoenixकरने के लिए "US Mountain Standard Time", Pacific/Honoluluकरने के लिए "Hawaiian Standard Time", America/Anchorageकरने के लिए "Alaskan Standard Time", और America/Adakकरने के लिए "Aleutian Standard Time"। यह अमेरिकी क्षेत्रों या ऐतिहासिक विसंगतियों को कवर नहीं करता है, लेकिन आपको आरंभ कर देगा।
मैट जॉनसन-पिंट

2
मैं इस दृष्टिकोण की सिफारिश नहीं करता अगर किसी का इरादा पूरी दुनिया को कवर करने का है या किसी मान्य समय क्षेत्र पहचानकर्ता से निपटने का है। सूची उसके लिए बहुत लंबी और बहुत अस्थिर है।
मैट जॉनसन-पिंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.