अगर आज कोई डेटटाइम होता है तो कैसे जांचें?


110

वहाँ एक बेहतर .net तरीका है अगर एक DateTime 'आज' तो नीचे कोड की जाँच की है?

if ( newsStory.WhenAdded.Day == DateTime.Now.Day &&
     newsStory.WhenAdded.Month == DateTime.Now.Month &&
     newsStory.WhenAdded.Year == DateTime.Now.Year )
{ 
    // Story happened today
}
else
{ 
    // Story didn't happen today
}

14
आप newStory.Date == DateTime.Now.Date
Guillaume

जवाबों:


222
if (newsStory.WhenAdded.Date == DateTime.Today)
{

}
else
{

}

चाल चलनी चाहिए।


3
... अगर newsStory.Date वास्तव में केवल समय के बिना तारीख का हिस्सा है। ;)
Lucero

14
... जो यह है, अगर newsStory एक डेटटाइम है
स्टीवेमेगसन

18
ठीक है, डेटटाइम .NET फ्रेमवर्क क्लास लाइब्रेरी का एक हिस्सा है, इसलिए जब यह संभव हो कि ओपी ने अपना वर्ग बनाया जो उसी नाम को साझा करने के लिए होता है, तो आपको आश्चर्य होगा कि वह StackOverflow से यह क्यों पूछेगा कि कस्टम क्लास का उपयोग कैसे करें उन्होंने बनाया और हमें उम्मीद है कि जादुई तरीके से यह कैसे काम करेगा। ;)
ब्रायन श्रोथ

2
@ ल्यूकोरो हालांकि यह संभव है कि प्रश्न शीर्षक 'दो डेटाइम' पढ़ता है। ;) मुझे लगता है कि हम कहाँ से उस लापता प्रकार मिल गया है।
प्राइक्रोमुलस

1
@HansPetterNaumann यह तार्किक है :) DateTime.AddHours () एक नया DateTime ऑब्जेक्ट लौटाता है, इस प्रकार प्रभावी रूप से आपके .Today ऑपरेशन को रद्द करता है, जिसमें वास्तव में एक समय घटक नहीं था।
पाइयोक्युमुलस

29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}

5
मैं जोड़ना चाहूंगा, यह एक बहुत ही आम है (और बग को स्पॉट करना मुश्किल है) - सिर्फ डेटाइम की तुलना डेटाइम टाइम से करें।
जेएल


14

मेरा समाधान:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}

7

यदि NewsStory एक DateTime का भी उपयोग कर रहा था, तो दिनांक संपत्ति की तुलना करें, और आप कर रहे हैं।

हालांकि, यह निर्भर करता है कि "आज" वास्तव में क्या मतलब है। यदि आधी रात से कुछ पहले पोस्ट किया जाता है, तो यह थोड़े समय के बाद "पुराना" होगा। तो शायद यह सटीक कहानी की तारीख (समय सहित, अधिमानतः यूटीसी) रखने के लिए सबसे अच्छा होगा और अगर 24 घंटे (या जो कुछ भी हो) से कम है, जो कि सरल है (तिथियों को घटाया जा सकता है, जो आपको कुल अंकों के साथ टाइमस्पैन देता है) या TotalDays संपत्ति)।


5

आप एक DateTime एक्सटेंशन विधि को लागू कर सकते हैं।

अपने विस्तार के तरीकों के लिए नई कक्षा बनाएँ:

namespace ExtensionMethods
{
    public static class ExtensionMethods
    {
        public static bool IsSameDay( this DateTime datetime1, DateTime datetime2 )
        {
            return datetime1.Year == datetime2.Year 
                && datetime1.Month == datetime2.Month 
                && datetime1.Day == datetime2.Day;
        }
    }
}

और अब, आपके कोड पर हर जगह, आप यह परीक्षण कहाँ करना चाहते हैं, आपको निम्नलिखित का उपयोग करना चाहिए:

using ExtensionMethods;

और फिर, एक्सटेंशन विधि का उपयोग करें:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
सिर्फ datetime1.ate == datetime2.Date को क्यों नहीं लौटाते?
सेर्गी मिन्द्रस

@SergiuMindras सही है, यह दोनों Dateकी तुलना करने के लिए पर्याप्त है क्योंकि यह TimeSpanहमेशा 00:00:00 होगा।
GoRoS

5

FYI करें,

newsStory.Date == DateTime.Today

परिणाम की तुलना कोडिंग के समान करेगा

newsStory == DateTime.Today

वस्तु कहां newsStoryहैDateTime

.NET यह निर्धारित करने के लिए पर्याप्त स्मार्ट है कि आप केवल दिनांक के आधार पर तुलना करना चाहते हैं और आंतरिक तुलना के लिए इसका उपयोग करते हैं। यकीन नहीं क्यों, और वास्तव में इस व्यवहार के लिए प्रलेखन खोजने में परेशानी हो रही है।




1

ठीक है, डेटटाइम के पास "दिनांक" संपत्ति है और आप बस उसी के आधार पर तुलना कर सकते हैं। लेकिन डॉक्स को देखने से ऐसा लगता है कि उस संपत्ति को वास्तव में एक नया डेटाइम मिलाता है, जिसमें आधी रात को सेट समय घटक होता है, इसलिए यह प्रत्येक व्यक्तिगत घटक तक पहुंचने की तुलना में बहुत अच्छा हो सकता है, हालांकि बहुत क्लीनर और अधिक पठनीय।


मुझे लगता है कि एक मंदी (यदि मौजूद है) इतनी छोटी होगी तो लगभग सभी मामलों में कोई फर्क नहीं पड़ता। निश्चित रूप से समय से पहले अनुकूलन का मामला है।
एसेन स्कोव पेडरसन

सहमत - इन दिनों मुझे लगता है कि समय से पहले अनुकूलन को बढ़ाना मुश्किल है क्योंकि आधुनिक कोडिंग दुनिया पठनीयता और स्थिरता के बारे में अधिक है। पुरानी आदतें मुश्किल से जाती हैं!
पीटर ब्रिजर


-4

कैसा रहेगा

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}

लेकिन यह 1 जनवरी 2008 और 1 जनवरी 2009 के लिए भी सही होगा, जो आप चाहते हैं या नहीं हो सकता है।


-6

आप उपयोग कर सकते हैं DateTime.Now.DayOfYear

 if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
 { // story happened today

 }
 else
 { // story didn't happen today

 }

1
मुझे नहीं लगता कि यह काम करेगा। अगर आज 10/21/2009 है, और newsStory 10/21/2008 है - तो यह सच हो जाएगा (मैंने यहां लीप वर्ष नहीं लिया है)।
फिलिप वालेस

2
यह नए डेटटाइम (2009, 10, 01) के बीच कोई भेदभाव नहीं करेगा ।DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
डेव डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.