किसी के बीच System.DateTime.Now
और System.DateTime.Today
C # .NET में अंतर समझा सकते हैं ? यदि संभव हो तो प्रत्येक के पेशेवरों और विपक्षों।
किसी के बीच System.DateTime.Now
और System.DateTime.Today
C # .NET में अंतर समझा सकते हैं ? यदि संभव हो तो प्रत्येक के पेशेवरों और विपक्षों।
जवाबों:
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.Today
DateTime
उस मान को लौटाता है जिसमें उपरोक्त अभिव्यक्तियों में से किसी एक के समान वर्ष, महीना और दिन घटक होते हैं, लेकिन समय घटकों के साथ शून्य पर सेट होता है। 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 समय ( GetSystemTimeAsFileTime
Win32 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.Now
3 नवंबर, 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);
DateTime.UtcNow
स्वीकार्य है यदि आप अपने आवेदन या कल्पना में बता सकते हैं कि मूल्य यूटीसी में है। (मैं वास्तव में की तरह क्षेत्र या संपत्ति कुछ कॉल करने के लिए की तरह MyDateUtc
बस के बजाय MyDate
-। लेकिन यह है कि केक पर सिर्फ टुकड़े है) आप कल्पना या क्षेत्र के नाम पर यह व्यक्त नहीं कर सकते, तो DateTimeOffset.UtcNow
शून्य ऑफसेट सुनिश्चित करने के लिए अवगत करा दिया जाता है इस्तेमाल किया जा सकता दिनांक और समय मानों के साथ।
DateTime.Now.Date
।
समय। .Now
जिसमें 09:23:12 या जो भी हो; .Today
केवल दिनांक-भाग है (उस दिन 00:00:00 बजे)।
इसलिए .Now
यदि आप समय को शामिल करना चाहते हैं, और .Today
यदि आप तारीख चाहते हैं तो इसका उपयोग करें !
.Today
अनिवार्य रूप से के रूप में ही है .Now.Date
UtcNow
जब तक आप वास्तव में सिस्टम को स्थानीय समय क्षेत्र नहीं चाहते हैं। (विशेष रूप से, एक वेब ऐप पर जो लगभग हमेशा गलत विकल्प होता है।)
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;
}
}
DateTime.Today वर्तमान सिस्टम दिनांक को 00:00:00 पर सेट किए गए समय भाग के साथ दर्शाता है
तथा
DateTime.Now वर्तमान सिस्टम दिनांक और समय का प्रतिनिधित्व करता है
(v=VS.100)
।
मैंने इन कड़ियों को जोड़ने के बारे में सोचा -
मूल प्रश्न पर वापस आते हुए, रिफ्लेक्टर का उपयोग करके मैंने कोड में अंतर समझाया है
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);
}
}
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 का उपयोग करना पूरी तरह से ठीक है।
जब आप वास्तविक मूल्य के साथ स्ट्रिंग प्रतिनिधित्व को भ्रमित करना शुरू करते हैं तो आप आमतौर पर मुसीबत में दौड़ना शुरू करते हैं, और डेटाइम को "ठीक" करने की कोशिश करते हैं, जब यह टूट नहीं जाता है।
DateTime.UtcNow
बजाय के उपयोग के बारे में क्याDateTimeOffset.Now
?