System.DateTime.Now और System.DateTime.Today के बीच अंतर


127

किसी के बीच System.DateTime.Nowऔर System.DateTime.TodayC # .NET में अंतर समझा सकते हैं ? यदि संभव हो तो प्रत्येक के पेशेवरों और विपक्षों।

जवाबों:


179

DateTime.Nowवह DateTimeमान लौटाता है जिसमें कंप्यूटर की स्थानीय तिथि और समय होता है जहां कोड चल रहा होता है। इसे DateTimeKind.Localअपनी Kindसंपत्ति सौंप दी है। यह निम्नलिखित में से किसी को बुलाने के बराबर है:

  • DateTime.UtcNow.ToLocalTime()
  • DateTimeOffset.UtcNow.LocalDateTime
  • DateTimeOffset.Now.LocalDateTime
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local)
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local)

DateTime.TodayDateTimeउस मान को लौटाता है जिसमें उपरोक्त अभिव्यक्तियों में से किसी एक के समान वर्ष, महीना और दिन घटक होते हैं, लेकिन समय घटकों के साथ शून्य पर सेट होता है। DateTimeKind.Localइसकी Kindसंपत्ति में भी है । यह निम्नलिखित में से किसी के बराबर है:

  • DateTime.Now.Date
  • DateTime.UtcNow.ToLocalTime().Date
  • DateTimeOffset.UtcNow.LocalDateTime.Date
  • DateTimeOffset.Now.LocalDateTime.Date
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local).Date
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local).Date

ध्यान दें कि आंतरिक रूप से, सिस्टम घड़ी UTC के संदर्भ में है, इसलिए जब आप DateTime.Nowइसे कॉल करते हैं तो इसे UTC समय ( GetSystemTimeAsFileTimeWin32 API में फ़ंक्शन के माध्यम से ) पहले मिल जाता है और फिर यह मान को स्थानीय समय क्षेत्र में परिवर्तित कर देता है। (इसलिए DateTime.Now.ToUniversalTime()की तुलना में अधिक महंगा है DateTime.UtcNow।)

यह भी ध्यान दें कि इसके DateTimeOffset.Now.DateTimeसमान मूल्य DateTime.Nowहोंगे, लेकिन इसके DateTimeKind.Unspecifiedबजाय यह होगाDateTimeKind.Local - जिससे आप इसके साथ क्या करते हैं, इसके आधार पर अन्य त्रुटियां हो सकती हैं।

तो, सरल उत्तर यह है कि DateTime.Todayइसके बराबर है DateTime.Now.Date
लेकिन IMHO - आपको इनमें से किसी एक या उपरोक्त समकक्षों में से किसी एक का उपयोग नहीं करना चाहिए।

जब आप पूछते हैं DateTime.Now, तो आप कंप्यूटर के स्थानीय कैलेंडर घड़ी का मूल्य पूछ रहे हैं जो कोड चल रहा है। लेकिन जो आपको वापस मिल जाता है, उस घड़ी के बारे में कोई जानकारी नहीं होती है! आपको जो सबसे अच्छा मिलता है, वह है DateTime.Now.Kind == DateTimeKind.Local। लेकिन यह किसका स्थानीय है? जैसे ही आप मूल्य के साथ कुछ भी करते हैं, यह जानकारी खो जाती है, जैसे कि इसे डेटाबेस में संग्रहीत करें, इसे स्क्रीन पर प्रदर्शित करें, या वेब सेवा का उपयोग करके इसे संचारित करें।

यदि आपका स्थानीय समय क्षेत्र किसी दिन के बचत नियमों का पालन करता है, तो आपको वह जानकारी वापस नहीं मिलती है DateTime.Now। अस्पष्ट समय में, जैसे "फ़ॉल-बैक" संक्रमण के दौरान, आपको पता नहीं चलेगा कि आप किन दो संभावित पलों के साथ पुनः प्राप्त मूल्य के अनुरूप हैं DateTime.Now। उदाहरण के लिए, मान लें कि आपका सिस्टम टाइम ज़ोन पर सेट है Mountain Time (US & Canada)और आप DateTime.Now3 नवंबर, 2013 के शुरुआती घंटों में पूछते हैं । परिणाम क्या होता है2013-11-03 01:00:00 मतलब है? इसी कैलेंडर डेटाटाइम द्वारा तात्कालिक समय के दो क्षणों का प्रतिनिधित्व किया जाता है। अगर मैं किसी और को यह मूल्य भेजना चाहता था, तो उन्हें कोई मतलब नहीं होगा कि मेरा क्या मतलब है। खासकर यदि वे एक समय क्षेत्र में हैं जहां नियम भिन्न हैं।

इसके DateTimeOffsetबजाय आप उपयोग करने के लिए सबसे अच्छी चीज होगी :

// This will always be unambiguous.
DateTimeOffset now = DateTimeOffset.Now;

अब उसी परिदृश्य के लिए जो मैंने ऊपर वर्णित किया है, मुझे 2013-11-03 01:00:00 -0600संक्रमण से पहले मूल्य मिलता है , या2013-11-03 01:00:00 -0700 संक्रमण के बाद मिलता है। इन मूल्यों को देखने वाला कोई भी व्यक्ति बता सकता है कि मेरा क्या मतलब था।

मैंने इसी विषय पर एक ब्लॉग पोस्ट लिखा था। कृपया पढ़ें - के खिलाफ DateTime.Now प्रकरण

इसके अलावा, इस दुनिया में कुछ स्थान हैं (जैसे कि ब्राजील) जहां "स्प्रिंग-फॉरवर्ड" संक्रमण ठीक आधी रात को होता है। घड़ियां 23:59 से 01:00 तक जाती हैं। इसका मतलब यह है कि DateTime.Todayउस तारीख के लिए आपको जो मूल्य मिलता है , वह मौजूद नहीं है! यदि आप उपयोग करते हैं DateTimeOffset.Now.Date, तब भी आपको वही परिणाम मिल रहा है, और आपको अभी भी यह समस्या है। ऐसा इसलिए है क्योंकि परंपरागत रूप से, Date.Net में ऑब्जेक्ट जैसी कोई चीज नहीं रही है। तो इस बात की परवाह किए बिना कि आप मूल्य कैसे प्राप्त करते हैं, एक बार जब आप समय निकाल देते हैं - आपको यह याद रखना होगा कि यह वास्तव में "मध्यरात्रि" का प्रतिनिधित्व नहीं करता है, भले ही आप जिस मूल्य के साथ काम कर रहे हैं।

यदि आप वास्तव में इस समस्या का पूरी तरह से सही समाधान चाहते हैं, तो सबसे अच्छा तरीका है NodaTime का उपयोग करनाLocalDateवर्ग ठीक से एक समय के बिना एक तिथि का प्रतिनिधित्व करता है। आप स्थानीय सिस्टम समय क्षेत्र सहित किसी भी समय क्षेत्र के लिए वर्तमान तिथि प्राप्त कर सकते हैं:

using NodaTime;
...

Instant now = SystemClock.Instance.Now;

DateTimeZone zone1 = DateTimeZoneProviders.Tzdb.GetSystemDefault();
LocalDate todayInTheSystemZone = now.InZone(zone1).Date;

DateTimeZone zone2 = DateTimeZoneProviders.Tzdb["America/New_York"];
LocalDate todayInTheOtherZone = now.InZone(zone2).Date;

यदि आप Noda Time का उपयोग नहीं करना चाहते हैं, तो अब एक और विकल्प है। मैंने .net CoreFX लैब परियोजना के लिए केवल-दिनांक ऑब्जेक्ट के कार्यान्वयन में योगदान दिया है । आप System.Timeपैकेज ऑब्जेक्ट को उनके MyGet फ़ीड में पा सकते हैं । एक बार अपनी परियोजना में शामिल होने के बाद, आप पाएंगे कि आप निम्न में से कोई भी कर सकते हैं:

using System;
...

Date localDate = Date.Today;

Date utcDate = Date.UtcToday;

Date tzSpecificDate = Date.TodayInTimeZone(anyTimeZoneInfoObject);

9
के DateTime.UtcNowबजाय के उपयोग के बारे में क्या DateTimeOffset.Now?
शमूएल ल्यू

5
DateTime.UtcNowस्वीकार्य है यदि आप अपने आवेदन या कल्पना में बता सकते हैं कि मूल्य यूटीसी में है। (मैं वास्तव में की तरह क्षेत्र या संपत्ति कुछ कॉल करने के लिए की तरह MyDateUtcबस के बजाय MyDate-। लेकिन यह है कि केक पर सिर्फ टुकड़े है) आप कल्पना या क्षेत्र के नाम पर यह व्यक्त नहीं कर सकते, तो DateTimeOffset.UtcNowशून्य ऑफसेट सुनिश्चित करने के लिए अवगत करा दिया जाता है इस्तेमाल किया जा सकता दिनांक और समय मानों के साथ।
मैट जॉनसन-पिंट

वे बराबर नहीं हैं। आज 00:00:00 के रूप में समय है।
जेम्स विल्किंस

@JamesWilkins - यकीन नहीं है कि तुम क्या कर रहे हो। तो करता है DateTime.Now.Date
मैट जॉनसन-पिंट

@MattJohnson यह सवाल DateTime.Today और DateTime.Now के बीच का अंतर पूछ रहा है, DateTime.Today और DateTime.Now.Date नहीं।
डेविड एंडरसन

85

समय। .Nowजिसमें 09:23:12 या जो भी हो; .Todayकेवल दिनांक-भाग है (उस दिन 00:00:00 बजे)।

इसलिए .Nowयदि आप समय को शामिल करना चाहते हैं, और .Todayयदि आप तारीख चाहते हैं तो इसका उपयोग करें !

.Today अनिवार्य रूप से के रूप में ही है .Now.Date


27
... और उपयोग करें UtcNowजब तक आप वास्तव में सिस्टम को स्थानीय समय क्षेत्र नहीं चाहते हैं। (विशेष रूप से, एक वेब ऐप पर जो लगभग हमेशा गलत विकल्प होता है।)
जॉन स्कीट

22

DateTime.Nowसंपत्ति वर्तमान दिनांक और समय, उदाहरण के लिए देता है 2011-07-01 10:09.45310

DateTime.Todayसंपत्ति उदाहरण के लिए शून्य पर सेट समय compnents के साथ आज की तारीख देता है, 2011-07-01 00:00.00000

DateTime.Todayसंपत्ति वास्तव में वापसी करने के लिए लागू किया गया है DateTime.Now.Date:

public static DateTime Today {
  get {
    DateTime now = DateTime.Now;
    return now.Date;
  }
}

9

DateTime.Today वर्तमान सिस्टम दिनांक को 00:00:00 पर सेट किए गए समय भाग के साथ दर्शाता है

तथा

DateTime.Now वर्तमान सिस्टम दिनांक और समय का प्रतिनिधित्व करता है


2
सिर्फ एक अवलोकन ... १.१ प्रलेखन ४.० प्रलेखन की तुलना में बहुत कम विस्तृत है; शायद vLatest से लिंक करना बेहतर है?
मार्क Gravell

3
@megaperlz: अब आप vLatest के बजाय 4.0 से लिंक कर रहे हैं। VLatest लिंक को हटाकर बनाया जा सकता है (v=VS.100)
ब्रायन

6

मैंने इन कड़ियों को जोड़ने के बारे में सोचा -

मूल प्रश्न पर वापस आते हुए, रिफ्लेक्टर का उपयोग करके मैंने कोड में अंतर समझाया है

 public static DateTime Today
    {
      get
      {
        return DateTime.Now.Date;   // It returns the date part of Now

        //Date Property
       // returns same date as this instance, and the time value set to 12:00:00 midnight (00:00:00) 
      }
    }


    private const long TicksPerMillisecond = 10000L;
    private const long TicksPerDay = 864000000000L;
    private const int MillisPerDay = 86400000;

    public DateTime Date
    {
       get
      {
        long internalTicks = this.InternalTicks; // Date this instance is converted to Ticks 
        return new DateTime((ulong) (internalTicks - internalTicks % 864000000000L) | this.InternalKind);  
// Modulo of TicksPerDay is subtracted - which brings the time to Midnight time 
      }
    }


     public static DateTime Now
        {
          get
          {
           /* this is why I guess Jon Skeet is recommending to use  UtcNow as you can see in one of the above comment*/
            DateTime utcNow = DateTime.UtcNow;


            /* After this i guess it is Timezone conversion */
            bool isAmbiguousLocalDst = false;
            long ticks1 = TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(utcNow, out isAmbiguousLocalDst).Ticks;
            long ticks2 = utcNow.Ticks + ticks1;
            if (ticks2 > 3155378975999999999L)
              return new DateTime(3155378975999999999L, DateTimeKind.Local);
            if (ticks2 < 0L)
              return new DateTime(0L, DateTimeKind.Local);
            else
              return new DateTime(ticks2, DateTimeKind.Local, isAmbiguousLocalDst);
          }
        }

5
DateTime dt = new DateTime();// gives 01/01/0001 12:00:00 AM
DateTime dt = DateTime.Now;// gives today date with current time
DateTime dt = DateTime.Today;// gives today date and 12:00:00 AM time

1

DateTime.Todayहै DateTime.Nowशून्य पर सेट समय के साथ।

यह नोट करना महत्वपूर्ण है कि दिनांक समय मान के बीच अंतर है, जो 1 जनवरी, 0000 की आधी रात के बाद से समाप्त होने वाले टिकों की संख्या का प्रतिनिधित्व करता है, और उस दिनांक समय मान के स्ट्रिंग प्रतिनिधित्व, जो एक तिथि और समय मान को व्यक्त करता है संस्कृति-विशिष्ट-विशिष्ट प्रारूप: https://msdn.microsoft.com/en-us/library/system.datetime.now%28v=vs.110%29.aspx

DateTime.Now.Ticksवास्तविक समय .net (मूल रूप से यूटीसी समय) द्वारा संग्रहीत किया जाता है, बाकी सिर्फ प्रतिनिधित्व हैं (जो प्रदर्शन उद्देश्यों के लिए महत्वपूर्ण हैं)।

यदि Kindसंपत्ति है DateTimeKind.Localयह परोक्ष स्थानीय कंप्यूटर के समय क्षेत्र जानकारी शामिल है। एक .net वेब सेवा पर भेजते समय, डेटटाइम मान डिफ़ॉल्ट रूप से समय क्षेत्र की जानकारी के साथ क्रमबद्ध होते हैं, जैसे 2008-10-31T15: 07: 38.6875000-05: 00, और एक अन्य समय क्षेत्र में एक कंप्यूटर अभी भी ठीक से जान सकता है कि समय क्या है के लिए भेजा जा रहा है।

तो, DateTime.Now और DateTime.Today का उपयोग करना पूरी तरह से ठीक है।

जब आप वास्तविक मूल्य के साथ स्ट्रिंग प्रतिनिधित्व को भ्रमित करना शुरू करते हैं तो आप आमतौर पर मुसीबत में दौड़ना शुरू करते हैं, और डेटाइम को "ठीक" करने की कोशिश करते हैं, जब यह टूट नहीं जाता है।


-1

DateTime.Now.ToShortDateString() केवल दिनांक भाग प्रदर्शित करेगा

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