2008-09-15 9 views
160

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

+1

बहुत देर हो सकती है लेकिन मैं इस ब्लॉग को इंगित करना चाहता हूं: http://blog.angeloflogic.com/2013/10/nlog-timestamps-with-millisecond.html –

+0

छोटे बेंच-मार्किंग http: // rextester। कॉम/QRDR82396 –

उत्तर

260

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

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

+63

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

+10

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

+0

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

71

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

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

हम DateTime.UtcNow उपयोग करें, क्योंकि हम एक वैश्विक वेब दर्शकों है, और क्योंकि मैं हर उपयोगकर्ता नाग के लिए नहीं करना चाहते, यह दर्शाता है कि क्या समय क्षेत्र में रहते हैं वे एक फार्म भरने के लिए।

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

+0

I डेटटाइम को संग्रहीत करने वाला दूसरा भी चाहिए। यूटीसीएनओ को केवल तभी जरूरी है जब सही घंटे प्राप्त करने के लिए 2 तिथियों की गणना की जाती है। जब मुझे सिर्फ एक रजिस्टरएट दिनांक प्रदर्शित करना होगा तो डेटटाइम.अब पर्याप्त है। – Elisabeth

1

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

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

6

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

यदि आप टाइमज़ोन-जागरूक तिथियों का उपयोग करना चाहते हैं, तो डेटटाइम ऑफसेट का उपयोग करें, जो एक समय क्षेत्र के साथ दिनांक/समय का प्रतिनिधित्व करता है। मुझे यह कठिन तरीका सीखना पड़ा। । .NET में समझने के लिए

+7

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

24

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

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

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

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

+1

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

+2

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

+0

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

21

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

तो सापेक्ष समय माप के लिए डेटटाइम.अब का उपयोग न करें।

4

ऊपर दिए गए बिंदुओं के लिए बस थोड़ा सा अतिरिक्त: दिनांक समय संरचना में Kind नामक एक छोटा ज्ञात फ़ील्ड भी शामिल है (कम से कम, मुझे इसके बारे में लंबे समय तक नहीं पता था)। यह मूल रूप से सिर्फ एक झंडा है जो दर्शाता है कि समय स्थानीय या यूटीसी है; यह स्थानीय समय के लिए यूटीसी से असली ऑफसेट निर्दिष्ट नहीं करता है। इस तथ्य के अलावा कि यह इंगित करता है कि किस तरह के इरादे का निर्माण किया गया था, यह भी ToUniversalTime() और ToLocalTime() कार्य के तरीके को प्रभावित करता है।

2

सवाल का "सरल" जवाब है:

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

DateTime.UtcNow एक दिनांक समय वर्तमान यूनिवर्सल समन्वित समय (उर्फ यूटीसी), जो एक ही होगा का प्रतिनिधित्व मान देता है सिस्टम के की परवाह किए बिना समय क्षेत्र। DateTime.Kind संपत्ति हो जाएगा DateTimeKind.Utc

1

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

12

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

आंतरिक रूप से दिनांक "टिक्स" के रूप में संग्रहीत किया जाता है (जो @ कार्ल कैमरा के उत्तर के विपरीत) अलग है यदि आप अब या UtcNow का उपयोग करते हैं।

DateTime.UtcNow अन्य भाषाओं की तरह व्यवहार करता है। यह टीएम को जीएमटी आधारित मूल्य पर सेट करता है। यह 'यूटीसी' को 'दयालु' भी सेट करता है।

डेटटाइम.अब टिक्स मान को में बदलता है तो यह होगा कि यह जीएमटी समय क्षेत्र में आपका दिन का समय होगा। यह 'स्थानीय' को 'तरह' भी सेट करता है।

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

अलग-अलग 'प्रकार' मानों के साथ डेटटाइम उदाहरण संगत नहीं हैं। कुछ कोड में

आइए नज़र ...

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 

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

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

प्रश्न का मेरा सीधा जवाब प्रत्येक के उपयोग के बारे में स्वीकार किए गए उत्तर की सिफारिश के साथ सहमत है। आपको हमेशा को दिनांक/समय (i प्रदर्शित करने और पार्सिंग) के अलावा, TypeTime ऑब्जेक्ट्स के साथ काम करने के लिए प्रयास करें। इसका मतलब है कि आपको लगभग हमेशा डेटटाइम का उपयोग करना चाहिए। यूटीसीएनओ, उन मामलों को छोड़कर जहां आप ऑब्जेक्ट बना रहे हैं, इसे प्रदर्शित करने के लिए, और इसे तुरंत छोड़ दें।

संबंधित मुद्दे