DateTime.Now बनाम DateTime.UtcNow


225

मैं सोच रहा था कि वास्तव में दो संपत्तियों के काम करने के सिद्धांत क्या हैं। मुझे पता है कि दूसरा एक सार्वभौमिक है और मूल रूप से समय क्षेत्र के साथ सौदा नहीं करता है, लेकिन क्या कोई विस्तार से बता सकता है कि वे कैसे काम करते हैं और किस परिदृश्य में उपयोग किया जाना चाहिए?


1
बहुत देर हो सकती है लेकिन मैं इस ब्लॉग को इंगित करना चाहता हूं: blog.angeloflogic.com/2013/10/…
काई वांग

छोटी बेंच-मार्किंग rextester.com/QRDR82396
डैनियल बी

जवाबों:


346

DateTime.UtcNow आपको दिनांक और समय बताता है क्योंकि यह समन्वित यूनिवर्सल टाइम में होगा, जिसे ग्रीनविच मीन टाइम टाइम ज़ोन भी कहा जाता है - मूल रूप से ऐसा होगा जैसे आप लंदन इंग्लैंड में थे, लेकिन गर्मियों के दौरान नहीं। DateTime.Now दिनांक और समय देता है क्योंकि यह आपके वर्तमान स्थान के किसी व्यक्ति को दिखाई देगा।

DateTime.Nowजब भी आप किसी इंसान को डेट दिखा रहे हों, तो मैं इसका उपयोग करने की सलाह दूंगा - इस तरह वे जिस मूल्य को देखते हैं, उसके साथ सहज होते हैं - यह ऐसी चीज है जिसकी तुलना वे आसानी से अपनी घड़ी या घड़ी पर कर सकते हैं। का प्रयोग करें DateTime.UtcNowजब आप (एक क्लाइंट-सर्वर मॉडल में) दिनांक स्टोर करने के लिए या उस तरह से उन्हें बाद में गणना के लिए उपयोग अपनी गणना अपने सर्वर से या एक दूसरे से अलग समय क्षेत्रों में ग्राहकों द्वारा भ्रमित हो नहीं करना चाहती।


84
एक उत्कृष्ट बिंदु - जब भंडारण एक डेटाबेस या फ़ाइल में दिनांक, निश्चित रूप से उन्हें यूटीसी में स्टोर!
जेफ एटवुड

15
आपको यह ध्यान रखना है कि जब आप डेटाबेस में UTC में तारीखों को संग्रहीत करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि डेटाबेस अपने स्वयं के समयक्षेत्रों को उन तारीखों में नहीं जोड़ता है जो स्पष्ट समय-सीमा नहीं देते हैं। ध्यान दें कि DateTime हमेशा एक के लिए पूछे जाने पर वर्तमान समय क्षेत्र का उपयोग करेगा।
ओमर वैन क्लोइटेन

@OmervanKloeten बहुत अच्छी बात बताता है। मुझे आश्चर्य हो रहा है कि इसके लिए हर बार सही तरीके से तारीखों को संग्रहीत करने और प्राप्त करने के लिए एक सुरुचिपूर्ण 'ऑल राउंड' समाधान है, भले ही आपका IIS और SQL सर्वर अलग-अलग टाइमज़ोन में हों।
TheGeekZn

1
@ JoshYates1980 हाँ आप अभी DateTime.UtcNow.AddYears (1)
कैथल एमएफ

3
NodaTime का उपयोग करें - यह आपको समय के बारे में अधिक उपयोगी तरीके से सोचने पर मजबूर करेगा और इस तरह की समस्याओं से बचा जाएगा
aateeque

86

यह वास्तव में काफी सरल है, इसलिए मुझे लगता है कि यह निर्भर करता है कि आपके दर्शक क्या हैं और वे कहां रहते हैं।

यदि आप Utc का उपयोग नहीं करते हैं, तो आपको उस व्यक्ति का समय क्षेत्र पता होना चाहिए जिसे आप दिनांक और समय प्रदर्शित कर रहे हैं - अन्यथा आप उन्हें सिस्टम या सर्वर समय में दोपहर 3 बजे कुछ ऐसा बताएंगे, जब यह वास्तव में शाम 5 बजे हुआ हो वे रहते हैं।

हम DateTime.UtcNowइसलिए उपयोग करते हैं क्योंकि हमारे पास एक वैश्विक वेब ऑडियंस है, और क्योंकि मैं यह बताना चाहता हूं कि प्रत्येक उपयोगकर्ता किसी ऐसे समय के लिए नहीं है जो यह दर्शाता है कि टाइमज़ोन किस समय में रहता है।

हम सापेक्ष समय (2 घंटे पहले, 1 दिन पहले आदि) भी प्रदर्शित करते हैं जब तक कि पोस्ट पर्याप्त नहीं हो जाती कि समय "समान" है, चाहे आप पृथ्वी पर कहीं भी रहें।


मैं दूसरा भी चाहता हूं कि DateTime.UtcNow को संग्रहीत करना केवल तभी आवश्यक है जब 2 घंटे की गणना सही घंटे प्राप्त करने के लिए की जाती है। जब मुझे सिर्फ एक RegisterAt दिनांक प्रदर्शित करनी है तो Datetime.Now पर्याप्त है।
एलिजाबेथ

36

प्रदर्शन अंतर पर भी ध्यान दें; DateTime.UtcNowकहीं-कहीं तो 30 गुना तेजी से होता है DateTime.Now, क्योंकि आंतरिक रूप DateTime.Nowसे बहुत अधिक समय समायोजन होता है (आप इसे आसानी से परावर्तक के साथ सत्यापित कर सकते हैं)।

तो DateTime.Nowसापेक्ष समय मापन के लिए उपयोग न करें ।


इसने मुझे एक दर्दनाक यात्रा में ले लिया है, बस यह जान लें कि UtNNow का प्रदर्शन बेहतर है और बस अपनी तिथियों को mysql में सहेजना और यह मान लेना कि यह utc है और UtcNow के साथ तारीख निर्भर प्रदर्शनों की तुलना इस वैश्विक
टाइमज़ोन

29

.NET में समझने के लिए एक मुख्य अवधारणा है कि है अब है अब । सभी पृथ्वी के ऊपर कोई फर्क नहीं पड़ता अगर आप के साथ एक चर लोड किस समय क्षेत्र आप तो कर रहे हैं DateTime.Nowया DateTime.UtcNow-। काम के समान है * आपका DateTimeवस्तु जानता है क्या समय क्षेत्र में हैं और असाइनमेंट की परवाह किए बिना इसे ध्यान में रखता है।

DateTime.UtcNowडेलाइट सेविंग टाइम सीमाओं के पार तारीखों की गणना करते समय काम में आने वाली उपयोगिता । अर्थात्, उन स्थानों पर जो दिन के समय की बचत के समय में भाग लेते हैं, कभी-कभी अगले दिन दोपहर से दोपहर तक 25 घंटे होते हैं, और कभी-कभी अगले दिन दोपहर और दोपहर के बीच 23 घंटे होते हैं। यदि आप समय ए और समय बी से घंटे की संख्या को सही ढंग से निर्धारित करना चाहते हैं, तो आपको गणना करने से पहले प्रत्येक को अपने यूटीसी समकक्षों में अनुवाद करना होगा TimeSpan

यह एक ब्लॉग पोस्ट द्वारा कवर किया गया है जो मैंने लिखा है कि आगे बताते हैं TimeSpan, और विषय पर एक और भी अधिक व्यापक एमएस लेख का लिंक शामिल है।

* स्पष्टीकरण: वर्तमान समय में या तो असाइनमेंट संग्रहीत करेगा। आप के माध्यम से दो चर एक लोड करने के लिए थे, तो DateTime.Now()और के माध्यम से अन्य दोनों के बीच अंतर मिलीसेकेंड, नहीं घंटे मानते हुए कि आपने समय क्षेत्र GMT से घंटे की दूरी पर कर रहे हैं होगा। जैसा कि नीचे उल्लेख किया गया है, उनके मूल्यों को प्रिंट करने से विभिन्न तार प्रदर्शित होंगे।DateTime.UtcNow()TimeSpanString


1
"DateTime.Now या DateTime.UtcNow के साथ एक चर लोड करने के बारे में - असाइनमेंट समान है": इसे स्पष्ट करने की आवश्यकता हो सकती है? जैसा कि मैं यहां EDT टाइमज़ोन (UTC -4) में बैठता हूं, मैंने क्रमशः DateTime.UtcNow और DateTime.Now को दो चर सौंपे, और फिर ToString () के साथ उनके मूल्यों को मुद्रित किया। प्रदर्शित मान 4 घंटे अलग थे - "समान" नहीं।
जॉन श्नाइडर

2
@JonSchneider, मेरा मानना ​​है कि आप सही हैं। कथन: "असाइनमेंट समान है" सत्य नहीं है। ToString () शायद यह परीक्षण करने का सबसे अच्छा तरीका नहीं है, क्योंकि यह समान तिथियों को अलग-अलग तरीके से प्रदर्शित कर सकता है (जैसे जावा करता है)। तुलना कार्य एक बेहतर परीक्षा है, और दिखाते हैं कि वे वास्तव में समान नहीं हैं।
टेड बीघम

मेरे "समान" कथन के लिए स्पष्टीकरण: DateTime.Now के माध्यम से एक चर लोड करें और DateTime.UtcNow के साथ एक और फिर TimeSpan अंतर प्रिंट करें। अंतर मिलीसेकंड का होगा और यह मानकर नहीं कि आप जीएमटी से घंटों दूर हैं।
कार्ल कैमरा

18

यह अच्छा प्रश्न है। मैं इसे फिर से पुनर्जीवित कर रहा हूँ कि कैसे .Net विभिन्न Kindमूल्यों के साथ व्यवहार करती है । जैसा कि @ ज्यान जीच बताते हैं, यह वास्तव में महत्वपूर्ण रूप से महत्वपूर्ण संपत्ति है और यह इस बात पर निर्भर करता है कि आप उपयोग करते हैं Nowया नहीं UtcNow

आंतरिक तारीख संग्रहीत के रूप में है Ticksजो (@Carl कैमरा के जवाब के विपरीत) अगर आप का उपयोग के आधार पर अलग है Nowया UtcNow

DateTime.UtcNowअन्य भाषाओं की तरह व्यवहार करता है। यह TicksGMT आधारित मूल्य पर सेट होता है। यह भी सेट करता Kindहै Utc

DateTime.Nowअगर यह जीएमटी टाइम ज़ोन में आपके दिन का समय था, तो इसकेTicks मूल्य को बदल देता है । यह भी सेट करता है ।KindLocal

यदि आप (GMT-6) 6 घंटे पीछे हैं, तो आपको 6 घंटे पहले GMT का समय मिल जाएगा। .Net वास्तव में Kindइस समय की उपेक्षा करता है और व्यवहार करता है जैसे कि यह 6 घंटे पहले था, भले ही यह "अब" माना जाता है। यह और भी अधिक टूट जाता है यदि आप एक DateTimeउदाहरण बनाते हैं तो अपना समय क्षेत्र बदलें और इसका उपयोग करने का प्रयास करें।

अलग-अलग 'काइंड' मूल्यों के साथ डेटटाइम इंस्टेंस संगत नहीं हैं।

आइए देखें कुछ कोड ...

    DateTime utc = DateTime.UtcNow;
    DateTime now = DateTime.Now;
    Debug.Log (utc + " " + utc.Kind);  // 05/20/2015 17:19:27 Utc
    Debug.Log (now + " " + now.Kind);  // 05/20/2015 10:19:27 Local

    Debug.Log (utc.Ticks);  // 635677391678617830
    Debug.Log (now.Ticks);  // 635677139678617840

    now = now.AddHours(1);
    TimeSpan diff = utc - now;
    Debug.Log (diff);  // 05:59:59.9999990

    Debug.Log (utc <  now);  // false
    Debug.Log (utc == now);  // false
    Debug.Log (utc >  now);  // true

    Debug.Log (utc.ToUniversalTime() <  now.ToUniversalTime());  // true
    Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() >  now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() -  now.ToUniversalTime());  // -01:00:00.0000010

जैसा कि आप यहां देख सकते हैं, तुलना और गणित फ़ंक्शन स्वचालित रूप से संगत समय में परिवर्तित नहीं होते हैं। Timespanलगभग एक घंटे किया जाना चाहिए था, लेकिन इसके बजाय लगभग 6. था "यूटीसी <अब" सच होना चाहिए (मैं भी सुनिश्चित करने के लिए एक घंटे के लिए जोड़ा), लेकिन अभी भी झूठा था।

आप 'आसपास के काम' को भी देख सकते हैं, जिसे केवल सार्वभौमिक समय में बदलना है जो कहीं भी Kindनहीं है।

सवाल का मेरा सीधा जवाब इस बात से सहमत है कि हर एक का उपयोग करने के बारे में स्वीकार किए जाते हैं। आपको हमेशा ऐसी वस्तुओं के साथ काम करने की कोशिश करनी चाहिए DateTimeजो Kind=Utci / o (प्रदर्शन और पार्सिंग) को छोड़कर हो। इसका मतलब है कि आपको लगभग हमेशा उन DateTime.UtcNowमामलों को छोड़कर उपयोग करना चाहिए , जहां आप केवल इसे प्रदर्शित करने के लिए ऑब्जेक्ट बना रहे हैं, और इसे तुरंत छोड़ दें।


7

डेटटाइम का कोई पता नहीं है कि समय क्षेत्र क्या हैं। यह हमेशा मानता है कि आप अपने स्थानीय समय पर हैं। UtcNow अर्थ केवल यह है कि "मेरे समय से घटाएं"।

यदि आप समय-ज्ञात तिथियों का उपयोग करना चाहते हैं, तो DateTimeOffset का उपयोग करें , जो कि एक समय-क्षेत्र के साथ दिनांक / समय का प्रतिनिधित्व करता है। मुझे यह सीखना पड़ा कि कठिन तरीका है।


9
पूरी तरह से सटीक होने के लिए (और प्रदर्शन कारणों से अब लोगों को UtcNow के उपयोग से बचना चाहिए), यह दूसरा तरीका है: अब UtcNow में समय क्षेत्र जोड़ता है और वास्तव में एक परिमाण धीमा है।
मफू

5

प्रश्न का "सरल" उत्तर है:

DateTime.Now एक रिटर्न दिनांक समय वर्तमान, सिस्टम का समय (जो समय क्षेत्र प्रणाली में चल रहा है में) का प्रतिनिधित्व मूल्य। DateTime.Kind संपत्ति हो जाएगा DateTimeKind.Local

DateTime.UtcNow वर्तमान यूनिवर्सल को-ऑर्डिनेटेड टाइम (उर्फ UTC) का प्रतिनिधित्व करने वाला डेटटाइम मान लौटाता है जो सिस्टम के टाइम ज़ोन की परवाह किए बिना समान होगा। DateTime.Kind संपत्ति हो जाएगा DateTimeKind.Utc


4

बस ऊपर बनाया अंक के लिए एक छोटे से अतिरिक्त समय: DATETIME struct भी एक छोटे से जाना जाता क्षेत्र कहा जाता है प्रकार (कम से कम, मैं एक लंबे समय के लिए इसके बारे में पता नहीं था)। यह मूल रूप से केवल एक ध्वज है जो दर्शाता है कि समय स्थानीय है या यूटीसी; यह स्थानीय समय के लिए UTC से वास्तविक ऑफसेट निर्दिष्ट नहीं करता है। इस तथ्य के अलावा कि यह इंगित करता है कि स्टैक का निर्माण किस इरादे से किया गया था, यह उस तरीके को भी प्रभावित करता है कि कैसे तरीके ToUniversalTime () और ToLocalTime () काम करते हैं।


3

1

DateTime.UtcNow एक निरंतर, एकल-मूल्यवान समय स्केल है, जबकि DateTime.Now निरंतर या एकल-मूल्यवान नहीं है। प्राथमिक कारण डेलाइट सेविंग टाइम है, जो यूटीसी पर लागू नहीं होता है। इसलिए UTC कभी भी एक घंटे आगे या पीछे नहीं कूदता है, जबकि स्थानीय समय (DateTime.Now) करता है। और जब यह पीछे की ओर कूदता है, तो समान समय मान दो बार होता है।


1

DateTime.UtcNow डेलाइट सेविंग टाइम को छोड़ने वाला एक यूनिवर्सल टाइम स्केल है। इसलिए DTC के कारण UTC कभी नहीं बदलता है।

लेकिन, DateTime.Now निरंतर या एकल-मूल्यवान नहीं है क्योंकि यह DST के अनुसार बदलता है। जिसका अर्थ है DateTime.Now, एक ही समय मूल्य दो बार एक उलझन में ग्राहकों को छोड़ने हो सकता है।


0

जब आपको मशीन के लिए एक स्थानीय समय की आवश्यकता होती है, तो आपका एप्लिकेशन (यूरोप के लिए CEST) पर चलता है, अब उपयोग करें। यदि आप एक सार्वभौमिक समय चाहते हैं - UtcNow। यह सिर्फ आपकी वरीयताओं का मामला है - शायद एक स्थानीय वेबसाइट / स्टैंडअलोन एप्लिकेशन बना रहा है जिसे आप उस समय उपयोगकर्ता का उपयोग करना चाहते हैं - जिससे उसकी समय-सीमा सेटिंग से प्रभावित हो - DateTime.Now।

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


0

बड़ा अंतर :) यह है कि DateTime.Now SharePoint वर्कफ़्लो में समर्थित नहीं है, आपको DateTime.UtcNow का उपयोग करना होगा

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