DateTime बनाम DateTimeOffset


742

वर्तमान में, हमारे पास DateTimeTimeZone जागरूक तरीके से .NET के व्यवहार का एक मानक तरीका है : जब भी हम उत्पादन करते हैं, DateTimeहम इसे UTC में करते हैं (उदाहरण का उपयोग करते हुए DateTime.UtcNow), और जब भी हम एक प्रदर्शित करते हैं, हम UTC से उपयोगकर्ता के स्थानीय समय में वापस परिवर्तित कर देते हैं। ।

यह ठीक काम करता है, लेकिन मैं इस बारे में पढ़ रहा हूं DateTimeOffsetऔर यह कैसे स्थानीय और UTC समय को वस्तु में कैद करता है। तो सवाल यह DateTimeOffsetहै कि हम जो पहले से कर रहे हैं उसकी तुलना में उपयोग करने के क्या फायदे होंगे ?


3
नीचे कुछ बेहतरीन जवाब दिए गए हैं। लेकिन मैं अभी भी सोच रहा हूँ कि क्या, अगर कुछ भी, आप DateTimeOffset का उपयोग शुरू करने के लिए आश्वस्त हो सकते हैं।
HappyNomad


जब भंडारण की बात आती है, तो stackoverflow.com/questions/4715620/… भी दिलचस्प है।
दीजन

जवाबों:


1169

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.UnspecifiedDateTime

बेशर्म प्लग:

कई लोगों ने मेरे साथ साझा किया है कि वे इस सादृश्य को बहुत मूल्यवान समझते हैं, इसलिए मैंने इसे अपने प्लुरलसाइट कोर्स, दिनांक और समय प्रारूप में शामिल किया । आपको "कैलेंडर समय बनाम तात्कालिक समय" नामक क्लिप में, दूसरे मॉड्यूल, "संदर्भ मामलों" में कैमरा सादृश्य के चरण-दर-चरण walkthrough मिल जाएगा।


4
@ZackJannsen यदि आपके पास DateTimeOffsetC # में है, तो आपको DATETIMEOFFSETSQL सर्वर में रहना चाहिए । DATETIME2या बस DATETIME(आवश्यक सीमा के आधार पर) नियमित DateTimeमूल्यों के लिए ठीक हैं। हां - आप किसी भी समय टाइमज़ोन + डोटो या utc की जोड़ी से स्थानीय समय को हल कर सकते हैं। अंतर यह है - क्या आप हमेशा प्रत्येक संकल्प के साथ नियमों की गणना करना चाहते हैं, या क्या आप उन्हें प्राथमिकता देना चाहते हैं? कई मामलों में (कभी-कभी कानूनी चिंताओं के लिए) एक डीटीओ एक बेहतर विकल्प है।
मैट जॉनसन-पिंट

3
@ZackJannsen आपके प्रश्न के दूसरे भाग के लिए, मैं यथासंभव सर्वर-साइड करने की सलाह दूंगा। जावास्क्रिप्ट समयक्षेत्र गणना के लिए बहुत अच्छा नहीं है। यदि आपको यह करना चाहिए, तो इनमें से किसी एक लाइब्रेरी का उपयोग करें । लेकिन सर्वर साइड सबसे अच्छा है। यदि आपके पास अन्य विस्तृत प्रश्न हैं, तो कृपया उनके लिए एक नया SO प्रश्न शुरू करें और यदि मैं कर सकता हूं तो मैं उत्तर दूंगा। धन्यवाद।
मैट जॉनसन-पिंट

4
@JoaoLeme - यह इस बात पर निर्भर करता है कि आपने इसे कहाँ से प्राप्त किया है। आप सही हैं कि यदि आप DateTimeOffset.Nowसर्वर पर कहते हैं , तो आप वास्तव में सर्वर की भरपाई करेंगे। मुद्दा यह है कि DateTimeOffsetप्रकार उस ऑफसेट को बनाए रख सकता है। आप आसानी से क्लाइंट पर ऐसा कर सकते हैं, इसे सर्वर पर भेजें, और फिर आपके सर्वर को क्लाइंट की ऑफसेट पता चल जाएगा।
मैट जॉनसन-पिंट

8
वास्तव में कैमरा सादृश्य से प्यार है।
सचिन काइथ

2
हाँ, यह सही है। सिवाय इसके कि डीटीओ को (स्थानीय समय, ऑफसेट) जोड़ी के रूप में संग्रहीत किया जाता है, (utc समय, ऑफसेट) जोड़ी नहीं। दूसरे शब्दों में, UTC से ऑफसेट स्थानीय समय में पहले से ही परिलक्षित होता है। वापस utc में परिवर्तित करने के लिए, ऑफ़सेट का चिह्न उल्टा करें और इसे स्थानीय समय पर लागू करें।
मैट जॉनसन-पिंट

328

Microsoft से:

DateTimeOffset मान के लिए ये उपयोग DateTime मानों की तुलना में बहुत अधिक सामान्य हैं। नतीजतन, DateTimeOffset को एप्लिकेशन डेवलपमेंट के लिए डिफ़ॉल्ट दिनांक और समय प्रकार माना जाना चाहिए।

स्रोत: "डेटटाइम, डेटटाइमऑफसेट, टाइमस्पैन और टाइमज़ोनइन्फो के बीच चयन" , एमएसडीएन

हम DateTimeOffsetलगभग हर चीज के लिए उपयोग करते हैं क्योंकि हमारे आवेदन समय में विशेष बिंदुओं के साथ सौदा करते हैं (उदाहरण के लिए जब एक रिकॉर्ड बनाया / अपडेट किया गया था)। साइड नोट के रूप में, हम DATETIMEOFFSETSQL Server 2008 में भी उपयोग करते हैं।

मैं देखता हूं कि DateTimeजब आप केवल तारीखों से निपटना चाहते हैं, या केवल एक सामान्य अर्थ में सौदा करना चाहते हैं, तो यह उपयोगी है। उदाहरण के लिए, यदि आप एक अलार्म है कि आप 7 बजे हर दिन के बंद करना चाहते हैं, तो आप संग्रहीत कर सकती है कि एक में DateTimeएक का उपयोग DateTimeKindकी Unspecifiedक्योंकि आप इसे डीएसटी की परवाह किए बिना 7 पर बंद करना चाहते हैं। लेकिन अगर आप अलार्म घटनाओं के इतिहास का प्रतिनिधित्व करना चाहते हैं, तो आप उपयोग करेंगे DateTimeOffset

मिश्रण का उपयोग करते समय सावधानी बरतें DateTimeOffsetऔर DateTimeविशेष रूप से असाइन करते समय और प्रकारों के बीच तुलना करें। इसके अलावा, केवल तुलना DateTimeउदाहरणों है कि एक ही कर रहे हैं DateTimeKindक्योंकि DateTimeध्यान न दी ऑफसेट समयक्षेत्र तुलना करते समय।


146
स्वीकृत उत्तर अत्यधिक लंबा है और सादृश्य उपजी है, यह एक बहुत बेहतर और अधिक संक्षिप्त जवाब आईएमओ है।
नेक्सस का कहना है कि

10
मैं सिर्फ इतना कहूंगा कि मुझे यह जवाब पसंद है, और मुझे यह भी पसंद है। हालांकि पिछले भाग में - यह सुनिश्चित करना भी Kindसमान है, तुलना त्रुटि में हो सकती है। यदि आपके दोनों पक्ष DateTimeKind.Unspecifiedवास्तव में यह नहीं जानते हैं कि वे एक ही समय क्षेत्र से आए थे। यदि दोनों पक्ष हैं DateTimeKind.Local, तो अधिकांश तुलनाएं ठीक होने जा रही हैं, लेकिन आप अभी भी त्रुटियां कर सकते हैं एक पक्ष स्थानीय समय क्षेत्र में अस्पष्ट है। वास्तव में केवल DateTimeKind.Utcतुलना करना मूर्खतापूर्ण है, और हाँ, DateTimeOffsetआमतौर पर पसंद किया जाता है। (चीयर्स!)
मैट जॉनसन-पिंट

1
+1 मैं इसमें शामिल होता हूं: आपके द्वारा चुना गया डेटा टाइप आपके इरादे को दर्शाता है। हर जगह DateTimeOffset का उपयोग न करें, बस कारण। यदि ऑफ़सेट आपकी गणना और रीडिंग-फ्रॉम / पर्सेंटिंग-टू द डेटाबेस के लिए मायने रखता है, तो DateTimeOffset का उपयोग करें। यदि इससे कोई फर्क नहीं पड़ता है, तो DateTime का उपयोग करें, इसलिए आप समझें (केवल डेटाटाइप को देखकर) कि ऑफसेट का कोई असर नहीं होना चाहिए और सर्वर के स्थानीयता के सापेक्ष टाइम्स होना चाहिए / मशीन आपके C # कोड पर चल रही है।
माइकिटिवे

"लेकिन अगर आप अलार्म घटनाओं के इतिहास का प्रतिनिधित्व करना चाहते हैं, तो आप DateTimeOffset का उपयोग करेंगे।" क्या आप यह समझाने की परवाह करेंगे कि आप ऐसा क्यों सोचते हैं? मैं इस पृष्ठ की सभी जानकारी को पढ़कर इसे भर सकता हूं लेकिन शायद आप इस तरह की जानकारी को आसानी से पढ़ने के तरीके में भी प्रदान कर सकते हैं। यह बहुत ही पठनीय उत्तर है।
Barrosy

77

डेटटाइम केवल दो अलग-अलग समय, स्थानीय समय और यूटीसी को संग्रहीत करने में सक्षम है। तरह संपत्ति जो इंगित करता है।

DateTimeOffset दुनिया में कहीं से भी स्थानीय समय को स्टोर करने में सक्षम होने के कारण इस पर विस्तार करता है। यह उस स्थानीय समय और यूटीसी के बीच ऑफसेट को भी संग्रहीत करता है । ध्यान दें कि जब तक आप UTC ऑफसेट को संग्रहीत करने के लिए अपनी कक्षा में एक अतिरिक्त सदस्य नहीं जोड़ते, तब तक DateTime यह कैसे नहीं कर सकता। या केवल कभी भी यूटीसी के साथ काम करें। जो अपने आप में एक बेहतरीन आइडिया है।


33

वहाँ कुछ स्थानों पर जहां DateTimeOffsetसमझ में आता है। एक वह है जब आप आवर्ती घटनाओं और दिन के उजाले की बचत समय के साथ काम कर रहे हैं। मान लीजिए कि मैं हर दिन सुबह 9 बजे जाने के लिए अलार्म सेट करना चाहता हूं। अगर मैं "यूटीसी के रूप में स्टोर, स्थानीय समय के रूप में प्रदर्शित करता हूं" नियम का उपयोग करता हूं, तो अलार्म एक अलग समय पर बंद हो जाएगा जब डेलाइट बचत समय प्रभावी होता है।

शायद अन्य हैं, लेकिन उपरोक्त उदाहरण वास्तव में एक है जिसे मैंने अतीत में चलाया है (यह DateTimeOffsetबीसीएल के अतिरिक्त होने से पहले था - उस समय मेरा समाधान स्थानीय समय क्षेत्र में स्पष्ट रूप से स्टोर करना था, और बचाना समय के साथ-साथ यह जानकारी: मूल रूप से DateTimeOffsetआंतरिक रूप से क्या करता है)।


12
DateTimeOffset DST समस्या को ठीक नहीं करता है
JarrettV

2
TimeZoneInfo वर्ग का उपयोग DST के लिए नियम करता है। यदि आप .net 3.5 पर हैं या बाद में तारीखों से निपटने के लिए TimeZone या TimeZoneInfo कक्षाओं का उपयोग करते हैं तो टाइमजोन ऑफसेट के साथ संयोजन के रूप में डेलाइट सेविंग टाइम को संभालना होगा।
जैक जैन्सेन

1
एक अपवाद (अलार्म ऐप) का अच्छा उदाहरण है, लेकिन जब समय उस तारीख से अधिक महत्वपूर्ण होता है जो आपको वास्तव में आवेदन के लिए अपने शेड्यूल डेटा संरचना में अलग करना चाहिए, अर्थात घटना प्रकार = दैनिक और समय = 09:00। यहां बिंदु यह है कि डेवलपर को इस बात से अवगत होना चाहिए कि वे किस प्रकार की तिथि दर्ज कर रहे हैं, उपयोगकर्ताओं के लिए गणना या प्रस्तुत कर रहे हैं। विशेष रूप से ऐप्स अधिक वैश्विक होते हैं, अब हमारे पास सॉफ्टवेयर लिखने के लिए मानक और बड़े ऐप स्टोर के रूप में इंटरनेट है। साइड नोड के रूप में, मैं Microsoft को एक अलग दिनांक और समय संरचना जोड़ना देखना चाहूंगा।
टोनी वॉल

3
संक्षेप में जराट और जैक की टिप्पणी: ऐसा लगता है कि डेटटाइम ओफसेट अकेले डीएसटी समस्या को नहीं सुलझाएगा, लेकिन टाइमजोनइन्फो के साथ संयोजन के रूप में डेटाइम ऑउटसेट का उपयोग करने से इसे संभाल लेंगे। यह DateTime से भिन्न नहीं है, जहाँ यूटैक है। दोनों ही मामलों में मुझे उस समय के क्षेत्र (न कि केवल ऑफसेट) को जानना चाहिए जो मैं उस समय का अनुमान लगा रहा हूं। (मैं उस उपयोगकर्ता की प्रोफ़ाइल में संग्रहीत कर सकता हूं या क्लाइंट से प्राप्त कर सकता हूं (उदाहरण के लिए विंडोज़) यदि संभव हो तो)। सही लग रहा है?
जेरेमी कुक

"वहाँ कुछ स्थानों पर DateTimeOffset समझ में आता है।" --- यकीनन, यह अक्सर समझ में नहीं आता है।
रॉनी ओवरबीई

23

सबसे महत्वपूर्ण अंतर यह है कि DateTime समय क्षेत्र की जानकारी संग्रहीत नहीं करता है, जबकि DateTimeOffset करता है।

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

उदाहरण के लिए, यदि आप Json.Net और ISO दिनांक प्रारूप का उपयोग करके Kind = स्थानीय के साथ दिनांक समय मान को क्रमबद्ध करते हैं, तो आपको एक स्ट्रिंग मिलेगा 2015-08-05T07:00:00-04। ध्यान दें कि पिछले भाग (-04) का आपके डेटटाइम या आपके द्वारा गणना करने के लिए उपयोग किए गए किसी भी ऑफसेट से कोई लेना-देना नहीं था ... यह केवल सर्वर के समय क्षेत्र की भरपाई है।

इस बीच, DateTimeOffset स्पष्ट रूप से ऑफसेट शामिल है। इसमें समय क्षेत्र का नाम शामिल नहीं हो सकता है, लेकिन कम से कम इसमें ऑफ़सेट शामिल हैं, और यदि आप इसे क्रमबद्ध करते हैं, तो आपको सर्वर के स्थानीय समय के अनुसार जो भी हो, उसके बजाय आपके मूल्य में स्पष्ट रूप से शामिल ऑफ़सेट प्राप्त होने जा रहे हैं।


14
उपरोक्त सभी उत्तरों के साथ, मुझे आश्चर्य है कि किसी ने भी आपके एकल वाक्य को लिखने की The most important distinction is that DateTime does not store time zone information, while DateTimeOffset does.
जहमत

9
DateTimeOffset समय क्षेत्र की जानकारी संग्रहीत नहीं करता है। एमएस डॉक शीर्षक "DateTime, DateTimeOffset, TimeSpan और TimeZoneInfo के बीच चयन" यह बताते हुए कहा गया है: "एक DateTimeOffset मान किसी विशेष समय क्षेत्र से बंधा नहीं है, लेकिन किसी भी समय क्षेत्र के किसी भी प्रकार से उत्पन्न हो सकता है"। उस ने कहा, DateTimeOffset IS टाइम ज़ोन है, जिसमें UTC की ऑफ़सेट है, जो सभी अंतर बनाता है और यही कारण है कि यह ऐप डेवलपमेंट से निपटने के लिए MS अनुशंसित डिफ़ॉल्ट क्लास है जो तारीख की जानकारी से संबंधित है। यदि आप वास्तव में इस बात की परवाह करते हैं कि डेटा किस विशिष्ट समय से आया है, तो आपको इसे अलग से संरक्षित करना होगा
stonedauwg

1
हां, लेकिन जैसा कि कई जगहों पर दिखाया गया है, + या - घंटे कुछ भी नहीं कहते हैं कि आप किस समय में थे और अंततः बेकार है। आपको जो करने की आवश्यकता है, उसके आधार पर, आप केवल Kind.Unspecified के रूप में एक डेटाइम स्टोर कर सकते हैं और फिर इसके टाइमज़ोन की आईडी स्टोर कर सकते हैं और मुझे लगता है कि आप वास्तव में बेहतर हैं।
अरविन

13

Microsoft का यह कोड सब कुछ समझाता है:

// Find difference between Date.Now and Date.UtcNow
  date1 = DateTime.Now;
  date2 = DateTime.UtcNow;
  difference = date1 - date2;
  Console.WriteLine("{0} - {1} = {2}", date1, date2, difference);

  // Find difference between Now and UtcNow using DateTimeOffset
  dateOffset1 = DateTimeOffset.Now;
  dateOffset2 = DateTimeOffset.UtcNow;
  difference = dateOffset1 - dateOffset2;
  Console.WriteLine("{0} - {1} = {2}", 
                    dateOffset1, dateOffset2, difference);
  // If run in the Pacific Standard time zone on 4/2/2007, the example
  // displays the following output to the console:
  //    4/2/2007 7:23:57 PM - 4/3/2007 2:23:57 AM = -07:00:00
  //    4/2/2007 7:23:57 PM -07:00 - 4/3/2007 2:23:57 AM +00:00 = 00:00:00

9

अधिकांश उत्तर अच्छे हैं, लेकिन मैंने अधिक जानकारी के लिए MSDN के कुछ और लिंक जोड़ने के बारे में सोचा



7

एक बड़ा अंतर यह है कि DateTimeOffsetइसका उपयोग TimeZoneInfoवर्तमान समय के अलावा अन्य समयक्षेत्रों में स्थानीय समय में बदलने के लिए किया जा सकता है ।

यह एक सर्वर एप्लिकेशन (उदाहरण के लिए ASP.NET) पर उपयोगी है जो विभिन्न टाइमज़ोन में उपयोगकर्ताओं द्वारा एक्सेस किया जाता है।


3
@Bugeo बुगेओ सच है, लेकिन एक जोखिम है। आप प्रत्येक पर "ToUniversalTime" कहकर दो DateTimes की तुलना कर सकते हैं। यदि आपके पास तुलनात्मक रूप से DateTimeKind = का एक मान है, तो अनिर्दिष्ट आपकी रणनीति विफल हो जाएगी। असफलता के लिए यह क्षमता डेटाइम पर DateTimeOffset पर विचार करने का एक कारण है जब स्थानीय समय के लिए रूपांतरण की आवश्यकता होती है।
जैक जैन्सेन

ऊपर के रूप में, मुझे लगता है कि इस परिदृश्य में आप बेहतर TimeZoneId भंडारण करने के लिए DateTimeOffset का उपयोग करने से बेहतर है, जो अंततः कुछ भी नहीं है।
अरविन

2

DateTimeOffset का एकमात्र नकारात्मक पक्ष मैं देख रहा हूं कि Microsoft अपने XmlSerializer वर्ग में इसका समर्थन करने के लिए "डिज़ाइन" (डिज़ाइन के द्वारा) भूल गया। लेकिन यह तब से XmlConvert उपयोगिता वर्ग में जोड़ा गया है।

XmlConvert.ToDateTimeOffset

XmlConvert.ToString

मैं कहता हूं कि सभी लाभों के कारण DateTimeOffset और TimeZoneInfo का उपयोग करें, बस संस्थाओं का निर्माण करते समय सावधान रहें या XML (या फिर सभी व्यावसायिक वस्तुओं) से सिलसिलेवार हो सकते हैं।

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