DateTime से टाइमजोन प्राप्त करें


103

क्या .Net DateTime में समय क्षेत्र के बारे में जानकारी है जहाँ इसे बनाया गया था?

मेरे पास एक प्रारूप से डेटटाइम को पार्स करने वाली लाइब्रेरी है, जिसमें अंत में "+ zz" है, और जब यह सही ढंग से पार्स करता है और एक स्थानीय समय को समायोजित करता है, तो मुझे यह प्राप्त करने की आवश्यकता है कि दिनांक समय ऑब्जेक्ट से विशिष्ट समय क्षेत्र क्या था।

क्या यह वास्तव में संभव है? सभी मैं देख सकता हूँ DateTime.Kind, जो निर्दिष्ट करता है कि क्या समय स्थानीय या UTC है।


समय क्षेत्र और DateTimeStyles से निपटने के लिए DateTime.Parse प्रलेखन पर नोट्स देखें । लेकिन नहीं, जो आप चाहते हैं वह वास्तव में संभव नहीं है।
योयो

जवाबों:


136

डेटटाइम में ही वास्तविक समय की जानकारी नहीं होती है। यह पता चल सकता है कि क्या यह यूटीसी या स्थानीय है, लेकिन यह नहीं कि वास्तव में स्थानीय का क्या मतलब है।

DateTimeOffset कुछ बेहतर है - यह मूल रूप से एक यूटीसी समय और एक ऑफसेट है। हालाँकि, यह अभी भी समय-सीमा निर्धारित करने के लिए वास्तव में पर्याप्त नहीं है, क्योंकि कई अलग-अलग टाइमज़ोन किसी एक बिंदु पर एक ही ऑफसेट हो सकते हैं। ऐसा लगता है कि यह आपके लिए काफी अच्छा हो सकता है, क्योंकि तारीख / समय को पार्स करते समय आपके पास काम करने के लिए मिल गया है।

.NET 3.5 के रूप में टाइम ज़ोन के लिए समर्थन इसके मुकाबले बहुत बेहतर है, लेकिन मैं वास्तव में एक मानक "ZonedDateTime" या ऐसा कुछ देखना चाहता हूं - एक यूटीसी समय और एक वास्तविक समय क्षेत्र। अपना खुद का निर्माण करना आसान है, लेकिन मानक पुस्तकालयों में इसे देखना अच्छा होगा।

संपादित करें: लगभग चार साल बाद, मैं अब Noda Time का उपयोग करने का सुझाव दूंगा जिसमें तारीख / समय प्रकारों का अधिक समृद्ध सेट है। मैं हालांकि पक्षपाती हूँ, नोडा टाइम के मुख्य लेखक के रूप में :)


2
कोडप्लेक्स पर पब्लिकडोमेन प्रेजेक्ट आपके लिए ऐसा करता है।
चीजो

यदि विश्व समय क्षेत्र स्थिर है और परिवर्तन नहीं करते हैं तो बीसीएल में एक टाइमजोन एनम अच्छा होगा।
जेफ लाफे

1
@jlafay: हालाँकि, वे बदलते हैं - उदाहरण के लिए, पिछले साल विंडोज में अधिक समय क्षेत्र जोड़े गए थे।
जॉन स्कीट

यह परियोजना अब लेखक द्वारा बनाए नहीं रखी जाती है; publicdomain.codeplex.com ऐसा लगता है कि शायद यह मदद कर सकता है, उपयोग के आधार पर, किसी को इसका उपयोग करने से पहले इसे सेट करना होगा; timezone.codeplex.com
AnneTheAgile

3
@AnneTheAgile: व्यक्तिगत रूप से मैं अपने खुद के Noda Time पुस्तकालय का उपयोग करने की सलाह दूंगा, बेशक :)
जॉन स्कीट

36

नहीं।

एक डेवलपर कुछ बाहरी तंत्र के माध्यम से डेटटाइम मान के साथ जुड़े समय-क्षेत्र की जानकारी का ट्रैक रखने के लिए जिम्मेदार है।

यहाँ एक उत्कृष्ट लेख का एक उद्धरण । प्रत्येक .Net डेवलपर के लिए पढ़ना चाहिए।

इसलिए मेरी सलाह है कि थोड़ा रैपर क्लास लिखें जो आपकी आवश्यकताओं के अनुरूप हो।



2

आप TimeZoneInfo वर्ग का उपयोग कर सकते हैं

TimeZone वर्ग स्थानीय समय क्षेत्र को पहचानता है, और समन्वित यूनिवर्सल टाइम (UTC) और स्थानीय समय के बीच समय को परिवर्तित कर सकता है। TimeZoneInfo ऑब्जेक्ट किसी भी समय क्षेत्र का प्रतिनिधित्व कर सकता है, और TimeZoneInfo वर्ग के तरीकों को किसी एक समय क्षेत्र में समय को किसी अन्य समय क्षेत्र में संबंधित समय में परिवर्तित करने के लिए उपयोग किया जा सकता है। TimeZoneInfo वर्ग के सदस्य निम्नलिखित कार्यों का समर्थन करते हैं:

  1. उस समय क्षेत्र को पुनः प्राप्त करना जो पहले से ही ऑपरेटिंग सिस्टम द्वारा परिभाषित किया गया है।

  2. सिस्टम पर उपलब्ध समय क्षेत्र की गणना करना।

  3. विभिन्न समय क्षेत्रों के बीच बार-बार रूपांतरण।

  4. एक नया समय क्षेत्र बनाना जो पहले से ही ऑपरेटिंग सिस्टम द्वारा परिभाषित नहीं है।

    बाद में पुनः प्राप्ति के लिए एक समय क्षेत्र को क्रमबद्ध करना।


1
... लेकिन, एक डेटटाइम दिया, अभी भी टाइमजोनइन्फो का उपयोग करने का कोई तरीका नहीं है, डेटटाइम के टाइमजोन को निर्धारित करने के लिए, मेरे ज्ञान के लिए।
रेमी डेस्प्रेस-स्माइथ

@ RemiDespres-Smyth मैं सिर्फ TimeZoneInfo को 1 क्लास में डेटटाइम के साथ स्टोर करता हूं।
कोनराड


0

आमतौर पर अभ्यास UTC के "टाइमज़ोन" के साथ डेटटाइम के रूप में डेटा पास करने के लिए होगा और फिर TimeZoneInfo ऑब्जेक्ट को पास करेगा और जब आप डेटा प्रदर्शित करने के लिए तैयार होंगे, तो आप UTC डेटटाइम को कनवर्ट करने के लिए TimeZoneInfo ऑब्जेक्ट का उपयोग करें।

दूसरा विकल्प डेटाइम को वर्तमान टाइमज़ोन के साथ सेट करना है, और फिर सुनिश्चित करें कि "टाइमज़ोन" डेटाइम ऑब्जेक्ट के लिए अज्ञात है, तो सुनिश्चित करें कि डेटटाइम फिर से टाइमज़ोनइन्फो के साथ पारित हो गया है जो डेटाइम के टाइम ज़ोन को इंगित करता है।

जैसा कि अन्य लोगों ने यहां संकेत दिया है, यह अच्छा होगा यदि Microsoft इस पर शीर्ष पर रहे और यह सब करने के लिए एक अच्छी वस्तु बनाए, लेकिन अभी के लिए आपको दो वस्तुओं से निपटना होगा।


0

DateTime को इसकी समय-सीमा ऑफसेट की जानकारी नहीं है। ऑफसेट या टाइमज़ोन नाम (जैसे EAT, CEST, EST आदि) को वापस करने के लिए कोई अंतर्निहित पद्धति नहीं है।

दूसरों द्वारा सुझाए गए अनुसार, आप अपनी तिथि को यूटीसी में बदल सकते हैं:

DateTime localtime = new DateTime.Now;
var utctime = localtime.ToUniversalTime();

और उसके बाद ही अंतर की गणना करें:

TimeSpan difference = localtime - utctime;

इसके अलावा आप DateTimeOffset का उपयोग करके एक समय को दूसरे में बदल सकते हैं:

DateTimeOffset targetTime = DateTimeOffset.Now.ToOffset(new TimeSpan(5, 30, 0));

लेकिन यह हानिपूर्ण संपीड़न की तरह है - केवल ऑफसेट आपको यह नहीं बता सकता है कि यह किस समय क्षेत्र के दो अलग-अलग देशों के अलग-अलग समय क्षेत्रों में हो सकता है और केवल वर्ष के भाग के लिए एक ही समय है (उदाहरण के लिए दक्षिण अफ्रीका और यूरोप)। इसके अलावा, ध्यान रखें कि गर्मियों के दिन के समय की बचत को विभिन्न तिथियों (ईएसटी बनाम सीईटी - 3 सप्ताह के अंतर) पर पेश किया जा सकता है।

आप TimeZoneInfo वर्ग का उपयोग करके अपने स्थानीय सिस्टम समय क्षेत्र का नाम प्राप्त कर सकते हैं:

TimeZoneInfo localZone = TimeZoneInfo.Local;
localZone.IsDaylightSavingTime(localtime) ? localZone.DaylightName : localZone.StandardName

मैं गैरी शेंक से सहमत हूं, कृपया उस लेख को पढ़ें जो उन्होंने सुझाया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.