नेट कुछ इतिहास ट्रैक करता है, लेकिन यह हमेशा सटीक नहीं होता है। आप एक गलतियों पर ठोकर खाई है।
.NET Windows से रजिस्ट्री के माध्यम से इसकी सभी समय क्षेत्र जानकारी आयात करता है, जैसा कि here और here वर्णित है। यदि आप HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Russian Standard Time\Dynamic DST
पर रजिस्ट्री में देखते हैं तो आप पाएंगे कि यह केवल इस समय क्षेत्र के लिए 2010 से आगे की जानकारी ट्रैक करता है। वर्ष 2000 में परीक्षण तिथियां अच्छी तरह से काम नहीं कर रही हैं, क्योंकि यह जल्द से जल्द (2010) उपलब्ध हो जाएगी।
बेस यूटीसी ऑफसेट जानकारी रजिस्ट्री में ट्रैक, लेकिन AdjustmentRule
वर्ग जो .NET इसे में आयात में नहीं है। आप इस समय क्षेत्र के लिए समायोजन नियमों की जांच, तो आप पाएंगे कि वर्ष 2012 से 2013 के बिलकुल नहीं आयात कर रहे हैं:
var tz = TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time");
foreach (var rule in tz.GetAdjustmentRules())
{
Console.WriteLine("{0:d} - {1:d}", rule.DateStart, rule.DateEnd);
}
उत्पादन:
1/1/0001 - 12/31/2010
1/1/2011 - 12/31/2011
1/1/2014 - 12/31/2014
हालांकि वे Windows रजिस्ट्री में मौजूद हैं, 2012 और 2013 आयात नहीं किए गए हैं क्योंकि उनके पास डेलाइट सेविंग टाइम एडजस्टमेंट नहीं है।
बेस ऑफ़सेट में परिवर्तन होने पर यह समस्या उत्पन्न होती है - जैसे कि इस समय क्षेत्र के लिए है। चूंकि यह वर्तमान में +3 है, और दो साल जहां यह +4 था आयात नहीं किया गया था, तो ऐसा लगता है कि उन लापता वर्षों के लिए +3 था।
TimeZoneInfo
का उपयोग कर इसके लिए कोई अच्छा समाधान नहीं है। यहां तक कि यदि आप अपना खुद का कस्टम समय क्षेत्र बनाने का प्रयास करते हैं, तो आपको उपलब्ध डेटा संरचनाओं में इस तरह के परिवर्तन को फ़िट करने में परेशानी होगी।
सौभाग्य से, एक और विकल्प है। आप Noda Time लाइब्रेरी के माध्यम से मानक IANA time zones का उपयोग कर सकते हैं।
निम्नलिखित कोड Noda समय का उपयोग करता है मिलान करने के लिए क्या आप अपने मूल कोड में लिखा है:
:
DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
Console.WriteLine(Instant.FromUtc(2012, 1, 1, 0, 0).InZone(tz).LocalDateTime);
Console.WriteLine(Instant.FromUtc(2012, 6, 1, 0, 0).InZone(tz).LocalDateTime);
Console.WriteLine(Instant.FromUtc(2000, 1, 1, 0, 0).InZone(tz).LocalDateTime);
Console.WriteLine(Instant.FromUtc(2000, 6, 1, 0, 0).InZone(tz).LocalDateTime);
आपके स्थानीय समय क्षेत्र पहले से ही मास्को के लिए सेट नहीं है, तो आप करने के लिए पहली पंक्ति को बदल सकते हैं
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/Moscow"];
उत्पादन:
1/1/2012 4:00:00 AM
6/1/2012 4:00:00 AM
1/1/2000 3:00:00 AM
6/1/2000 4:00:00 AM
अद्यतन
AdjustmentRule
के ऊपर वर्णित समस्या बेस ऑफसेट परिवर्तनों को ट्रैक न करने के लिए Microsoft समर्थन आलेख KB3012229 में वर्णित किया गया था, और बाद में .NET Framework 4.6 और .NET कोर में भी तय किया गया था।
the reference sources में, कोई देख सकता है कि AdjustmentRule
अब m_baseUtcOffsetDelta
फ़ील्ड रखता है। हालांकि इस क्षेत्र को सार्वजनिक संपत्ति के माध्यम से प्रकट नहीं किया गया है, यह गणनाओं में कारक है, और यदि आप FromSerializedString
और ToSerializedString
विधियों (यदि कोई वास्तव में उन का उपयोग करता है) का उपयोग करते हैं तो यह क्रमबद्धता में प्रतिबिंबित होता है।
'डेटटाइम ऑफसेट' पर एक नज़र डालें। *** यदि *** डेटा को कैप्चर करते समय आप टाइमज़ोन ऑफसेट को कैप्चर कर सकते हैं तो आप इसे प्रदर्शित करने के लिए बेहतर आकार में होंगे और इसकी गणना करेंगे। –