DateTimeOffset
तात्कालिक समय का प्रतिनिधित्व है (जिसे निरपेक्ष समय के रूप में भी जाना जाता है )। उसके द्वारा, मेरा मतलब है कि ऐसा समय जो सभी के लिए सार्वभौमिक हो ( लीप सेकंड के लिए लेखांकन नहीं , या समय के प्रसार के सापेक्ष प्रभाव )। तात्कालिक समय का प्रतिनिधित्व करने का एक और तरीका DateTime
जहां .Kind
है के साथ है DateTimeKind.Utc
।
यह कैलेंडर समय ( नागरिक समय के रूप में भी जाना जाता है ) से अलग है, जो किसी के कैलेंडर पर एक स्थिति है, और दुनिया भर में कई अलग-अलग कैलेंडर हैं। हम इन कैलेंडरों फोन समय क्षेत्र । कैलेंडर समय को दर्शाया गया है DateTime
कि कहां .Kind
है DateTimeKind.Unspecified
, याDateTimeKind.Local
। और .Local
केवल उन परिदृश्यों में सार्थक है जहां आपको परिणाम का उपयोग करने वाले कंप्यूटर की एक अंतर्निहित समझ है, जहां स्थिति है। (उदाहरण के लिए, एक उपयोगकर्ता का कार्य केंद्र)
तो फिर, DateTimeOffset
यूटीसी के बजाय क्यों DateTime
? यह सब परिप्रेक्ष्य के बारे में है। आइए एक सादृश्य का उपयोग करें - हम फोटोग्राफर होने का नाटक करेंगे।
कल्पना कीजिए कि आप कैलेंडर टाइमलाइन पर खड़े हैं, जो आपके सामने रखी गई तात्कालिक समयरेखा पर एक व्यक्ति को एक कैमरा इंगित करता है। आप अपने टाइमज़ोन के नियमों के अनुसार अपना कैमरा लाइन करते हैं - जो समय-समय पर दिन के समय की बचत, या आपके समय क्षेत्र की कानूनी परिभाषा में अन्य परिवर्तनों के कारण बदलते हैं। (आपके पास एक स्थिर हाथ नहीं है, इसलिए आपका कैमरा अस्थिर है।)
फोटो में खड़ा व्यक्ति उस कोण को देखेगा जिस पर आपका कैमरा आया था। यदि अन्य लोग तस्वीरें ले रहे थे, तो वे विभिन्न कोणों से हो सकते हैं। इसी का Offset
हिस्सा हैDateTimeOffset
का प्रतिनिधित्व करता है।
इसलिए यदि आप अपने कैमरे को "पूर्वी समय" लेबल करते हैं, तो कभी-कभी आप -5 से इंगित कर रहे हैं, और कभी-कभी आप -4 से इंगित कर रहे हैं। दुनिया भर में कैमरे हैं, सभी अलग-अलग चीजों को लेबल करते हैं, और सभी अलग-अलग कोणों से एक ही तात्कालिक समय पर इशारा करते हैं। उनमें से कुछ एक दूसरे के ठीक बगल में (या ऊपर) हैं, इसलिए केवल यह जानना पर्याप्त नहीं है कि यह निर्धारित करने के लिए पर्याप्त समय है कि समय किससे संबंधित है।
और यूटीसी के बारे में क्या? खैर, यह एक कैमरा है जो स्थिर हाथ होने की गारंटी है। यह एक तिपाई पर है, दृढ़ता से जमीन में लंगर डाला। यह कहीं नहीं जा रहा है। हम इसके कोण को शून्य ऑफसेट कहते हैं।
तो - यह उपमा हमें क्या बताती है? यह कुछ सहज दिशा-निर्देश प्रदान करता है-
यदि आप विशेष रूप से किसी स्थान के सापेक्ष समय का प्रतिनिधित्व कर रहे हैं, तो कैलेंडर समय में इसका प्रतिनिधित्व करें DateTime
। बस सुनिश्चित करें कि आप कभी भी एक कैलेंडर को दूसरे के साथ भ्रमित नहीं करते हैं। Unspecified
आपकी धारणा होनी चाहिए। Local
केवल उपयोगी है DateTime.Now
। उदाहरण के लिए, मैं DateTime.Now
इसे डेटाबेस में प्राप्त कर सकता हूं और सहेज सकता हूं - लेकिन जब मैं इसे पुनः प्राप्त करता हूं, तो मुझे यह मान लेना होगा कि यह है Unspecified
। मैं भरोसा नहीं कर सकता कि मेरा स्थानीय कैलेंडर वही कैलेंडर है जिसे मूल रूप से लिया गया था।
यदि आपको हमेशा कुछ निश्चित करना चाहिए, तो सुनिश्चित करें कि आप तात्कालिक समय का प्रतिनिधित्व कर रहे हैं। DateTimeOffset
इसे लागू करने के लिए उपयोग करें या DateTime
सम्मेलन द्वारा यूटीसी का उपयोग करें ।
यदि आपको तात्कालिक समय के एक क्षण को ट्रैक करने की आवश्यकता है, लेकिन आप यह भी जानना चाहते हैं कि "उपयोगकर्ता ने अपने कैलेंडर कैलेंडर पर किस समय सोचा था?" - तो आप एक का उपयोग करना चाहिएDateTimeOffset
। यह टाइमकीपिंग सिस्टम के लिए बहुत महत्वपूर्ण है, उदाहरण के लिए - तकनीकी और कानूनी चिंताओं दोनों के लिए।
यदि आपको कभी भी पहले से रिकॉर्ड किए गए को संशोधित करने की आवश्यकता है DateTimeOffset
- तो आपको यह सुनिश्चित करने के लिए अकेले ऑफ़सेट में पर्याप्त जानकारी नहीं है कि नया ऑफ़सेट अभी भी उपयोगकर्ता के लिए प्रासंगिक है। आपको भी चाहिए एक टाइमज़ोन पहचानकर्ता संग्रहीत (सोचें - मुझे उस कैमरे के नाम की आवश्यकता है ताकि मैं एक नई तस्वीर ले सकूं भले ही स्थिति बदल गई हो)।
यह भी बताया जाना चाहिए कि Noda Time के पास इसके लिए एक प्रतिनिधित्व है ZonedDateTime
, जबकि .Net बेस क्लास लाइब्रेरी के पास ऐसा कुछ नहीं है। आपको एक DateTimeOffset
और एक TimeZoneInfo.Id
मूल्य दोनों को संग्रहीत करने की आवश्यकता होगी ।
कभी-कभी, आप एक कैलेंडर समय का प्रतिनिधित्व करना चाहेंगे जो कि "जिसे देख रहा है" वह स्थानीय है। उदाहरण के लिए, जब परिभाषित करना आज का मतलब है। आज हमेशा आधी रात से आधी रात होती है, लेकिन ये तात्कालिक समय पर अतिव्यापी सीमाओं की एक निकट-अनंत संख्या का प्रतिनिधित्व करते हैं। (व्यवहार में हमारे पास समय की एक सीमित संख्या है, लेकिन आप टिक से नीचे की ओर अभिव्यक्त कर सकते हैं) इसलिए इन स्थितियों में, सुनिश्चित करें कि आप समझते हैं कि या तो "कौन पूछ रहा है?" एक ही समय क्षेत्र के लिए नीचे सवाल करें, या उचित रूप में तात्कालिक समय के लिए उन्हें वापस अनुवाद करने के साथ सौदा।
यहाँ DateTimeOffset
इस सादृश्य के बारे में कुछ अन्य छोटे अंश दिए गए हैं , और इसे सीधे रखने के लिए कुछ सुझाव दिए गए हैं:
यदि आप दो DateTimeOffset
मूल्यों की तुलना करते हैं, तो तुलना करने से पहले उन्हें पहले शून्य ऑफसेट के लिए सामान्यीकृत किया जाता है। दूसरे शब्दों में, 2012-01-01T00:00:00+00:00
और 2012-01-01T02:00:00+02:00
उसी तात्कालिक क्षण को देखें, और इसलिए समतुल्य हैं।
यदि आप किसी भी इकाई परीक्षण कर रहे हैं और ऑफसेट से कुछ होने की आवश्यकता है, तो मूल्य और संपत्ति दोनों का अलग-अलग परीक्षण करें ।DateTimeOffset
.Offset
.Net फ्रेमवर्क में बनाया गया एक तरफ़ा निहित रूपांतरण है जो आपको DateTime
किसी भी DateTimeOffset
पैरामीटर या चर में प्रवेश करने देता है । ऐसा करते समय, मायने रखती है । यदि आप एक यूटीसी तरह से गुजरते हैं, तो यह एक शून्य ऑफसेट के साथ होगा, लेकिन यदि आप या तो पास करते हैं , तो यह स्थानीय माना जाएगा । फ्रेमवर्क मूल रूप से कह रहा है, "ठीक है, आपने मुझे कैलेंडर समय को तात्कालिक समय में बदलने के लिए कहा था, लेकिन मुझे नहीं पता कि यह कहां से आया है, इसलिए मैं सिर्फ स्थानीय कैलेंडर का उपयोग करने जा रहा हूं।" यदि आप कंप्यूटर पर एक अलग टाइमज़ोन के साथ एक अनिर्दिष्ट लोड करते हैं तो यह एक विशाल गोच है । (IMHO - कि एक अपवाद फेंक देना चाहिए - लेकिन यह नहीं है।).Kind
.Local
.Unspecified
DateTime
बेशर्म प्लग:
कई लोगों ने मेरे साथ साझा किया है कि वे इस सादृश्य को बहुत मूल्यवान समझते हैं, इसलिए मैंने इसे अपने प्लुरलसाइट कोर्स, दिनांक और समय प्रारूप में शामिल किया । आपको "कैलेंडर समय बनाम तात्कालिक समय" नामक क्लिप में, दूसरे मॉड्यूल, "संदर्भ मामलों" में कैमरा सादृश्य के चरण-दर-चरण walkthrough मिल जाएगा।