DateTime.Compare यदि कोई दिनांक 30 दिनों से कम पुरानी है तो कैसे जांचें?


86

यदि कोई खाता 30 दिनों से कम समय में समाप्त होता है, तो मैं काम करने की कोशिश कर रहा हूं। क्या मैं DateTime की तुलना सही ढंग से कर रहा हूं?

if (DateTime.Compare(expiryDate, now) < 30)

{
     matchFound = true;
}

जवाबों:


232

क्या मैं DateTime की तुलना सही ढंग से कर रहा हूं?

नहीं, Compareकेवल दो तिथियों की सापेक्ष स्थिति के बारे में जानकारी प्रदान करता है: कम, बराबर या अधिक। आप जो चाहते हैं वह कुछ इस तरह है:

if ((expiryDate - DateTime.Now).TotalDays < 30)
    matchFound = true;

यह दो DateTimeएस घटाता है । परिणाम एक TimeSpanवस्तु है जिसमें एक TotalDaysसंपत्ति है।

इसके अतिरिक्त, सशर्त को सीधे रूप में लिखा जा सकता है:

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

कोई ifजरूरत नहीं ।


2
आपको जवाब देने के लिए 2+;) देना चाहिए और एक इसे व्यक्त करने के लिए एक छोटा रास्ता है
CheGueVerra

4
उह ... मैंने अभी-अभी अपना उत्तर दिया है इसलिए एक काल्पनिक वोट को घटाने के लिए स्वतंत्र महसूस करता हूं। ;-)
कोनराड रुडोल्फ

1
कृपया TotalDaysदिनों के बजाय उपयोग करें ।
जोआ पोएला

2
यह वैचारिक रूप से अधिक सटीक है। इससे कोई फर्क नहीं पड़ता क्योंकि Daysसबसे बड़ा घटक है TimeSpan। इसे पढ़ने वाले लोग यह अनुमान लगा सकते हैं कि यह सोचने के लिए कि Secondsसंपत्ति उसी तरह से काम करती है।
जोहो पोर्टेला

2
जोआओ पोर्टेला को इस बिंदु से जोड़ना, यहां तक ​​कि Daysखुद भी गलत हो सकता है। Daysऔर TotalDaysयहां केवल वही हैं क्योंकि स्थिति है < 30, लेकिन अगर यह था <= 30, तो एक स्पष्ट अंतर होगा , क्योंकि TotalDaysरिटर्न 30.421करते समय ऐसा कुछ हो सकता Daysहै 30
राहिल हिलन

15

होना चाहिए

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

कुल दिनों पर ध्यान दें अन्यथा आपको वरीद व्यवहार मिलेगा


इस उत्तर को स्वीकार किए गए उत्तर को अंतिम संपादित करने के एक साल बाद खत्म हो गया था!
मिच गेहूं

@ मिच - यह सही उत्तर है, ध्यान दें कि वह डेज के बजाय टोटलडे का उपयोग कर रहा है।
मार्सेलो मेसन

स्वीकृत उत्तर सही है। TotalDays एक भिन्नात्मक भाग भी लौटाती है, जो पूर्णांक की तुलना में निरर्थक है।
मिच गेहूं

1
@MitchWheat TotalDaysका उपयोग करने के लिए वैचारिक रूप से सही क्षेत्र है। व्यवहार में वे एक ही परिणाम देते हैं लेकिन केवल इसलिए Daysकि सबसे बड़ा घटक है TimeSpan, एक महीने या वर्षों का घटक था और यह एक अलग कहानी होगी। बस के साथ प्रयास करें Hours, Secondsया Millisecondsयह देखने के लिए कि वे कैसे काम करते हैं।
जोओ पोर्टेला

7

वैसे मैं इसके बजाय यह करना होगा:

TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30) 
   matchFound = true;

केवल एक पूर्णांक के साथ उत्तर की तुलना करें जो यह दर्शाता है कि मौसम पहले है, पहले या बाद में ...


6

इसके बजाय यह प्रयास करें

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}

1
हम्म, आपको या तो अपनी तारीखों के क्रम को उलटने या निरपेक्ष मान लेने की आवश्यकता है, जब तक कि समाप्ति की तारीख पहले से ही पारित न हो।
कोनराड रुडोल्फ

3

क्रमशः, से कम, के बराबर, से अधिक के लिए 1, 0, -1 की तुलना करें।

तुम्हें चाहिए:

    if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) 
    { 
        bool matchFound = true;
    }

1

यह आपको सटीक परिणाम देगा:

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;

वास्तव में क्या होता है घंटा होता है। उदाहरण के लिए U.iteryDte 28/4/2011 है यदि U संस्कार (expiryDate-DateTime.now) इसमें समय लगेगा (28/4/2011 12:00:00 AM - 26/4/2011 11 : 47: 00 AM) और इसके बाद के संस्करण कोड 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM के रूप में मूल्य लेता है जो बीमार सटीक अंतर देते हैं।
जयंत

1

तुलना अनावश्यक है, दिन / TotalDays अनावश्यक हैं।

जो तुम्हे चाहिए वो है

if (expireDate < DateTime.Now) {
    // has expired
} else {
    // not expired
}

ध्यान दें कि यह तब काम करेगा जब आप अपने एक्सपायरी मापदंड के रूप में मिनटों या महीनों या वर्षों का उपयोग करने का निर्णय लेते हैं।


1
एक शानदार जवाब नहीं क्योंकि अब आप घंटों, मिनटों और सेकंड्स में फैक्टरिंग कर रहे हैं। DateTime.Today ओपी स्थिति के लिए अधिक सही होगा।
जेएल

1

यदि आप false(यदि लागू हो) असाइन करना चाहते हैं, तो matchtimeइसे लिखने का एक सरल तरीका होगा।

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);

यहाँ का टर्नरी ऑपरेटर पूरी तरह से बेमानी है ((एक्सपायरीडेट - DateTime.Now) .TotalDays <30) पहले से ही एक बूलियन देता है।
फेबियो

@ फैबियो धन्यवाद दोस्त ने उन्हें वापसी प्रकार के माध्यम से बूलियन मान असाइन करने के लिए हटा दिया।
मैजिक मिक

0

नहीं, तुलना फ़ंक्शन 1, 0, या -1 पर वापस आ जाएगा। 0 जब दो मान समान होते हैं, -1 और 1 का मतलब इससे कम और अधिक होता है, तो मैं उस क्रम में विश्वास करता हूं, लेकिन मैं अक्सर उन्हें मिलाता हूं।


0

नहीं, आप इसका सही उपयोग नहीं कर रहे हैं।

देखें यहाँ जानकारी के लिए।

DateTime t1 = new DateTime(100);
DateTime t2 = new DateTime(20);

if (DateTime.Compare(t1, t2) >  0) Console.WriteLine("t1 > t2"); 
if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2"); 
if (DateTime.Compare(t1, t2) <  0) Console.WriteLine("t1 < t2");

0

आप क्या करना चाहते हैं दो DateTimes (expiryDate और DateTime.Now) घटाना है। यह प्रकार TimeSpan की एक वस्तु लौटाएगा। टाइमस्पैन में एक संपत्ति "डेज" है। अपने उत्तर के लिए उस संख्या की तुलना 30 से करें।


0

नहीं, यह सही नहीं है, इसे आज़माएँ:

DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
    matchFound = true;
}

0

वास्तव में इनमें से किसी भी उत्तर ने मेरे लिए काम नहीं किया। मैंने इसे इस तरह से हल किया:

  if ((expireDate.Date - DateTime.Now).Days > -30)
  {
    matchFound = true;
  }

जब मैंने ऐसा करने की कोशिश की:

matchFound = (expiryDate - DateTime.Now).Days < 30;

आज, 2011-11-14 और मेरी एक्सपायरी डेट 2011-10-17 थी, मुझे वह मैचफाउंड = -28 मिला। 28 के बजाय। इसलिए मैंने आखिरी चेक का इस्तेमाल किया।


0
// this isn't set up for good processing.  
//I don't know what data set has the expiration 
//dates of your accounts.  I assume a list.
// matchfound is a single variablethat returns true if any 1 record is expired.

bool matchFound = false;
            DateTime dateOfExpiration = DateTime.Today.AddDays(-30);
            List<DateTime> accountExpireDates = new List<DateTime>();
            foreach (DateTime date in accountExpireDates)
            {
                if (DateTime.Compare(dateOfExpiration, date) != -1)
                {
                    matchFound = true;
            }
            }

1
क्या यह थोड़ा जटिल नहीं है?
मैक्स

प्रश्न में accountExpireDates का उल्लेख कहाँ है? आप एक बुरा समाधान चिपकाए। मैचफाउंड लगभग लगता है जैसे आप पैटर्न या रेग को मिला रहे हैं। Btw, आपको एक मैच मिलने पर तोड़ने की जरूरत है या यह लूप जारी है। इसके अलावा अगर यह -2 है तो क्या होगा? एमएसडीएन यह नहीं कहता कि संभावित मान -1, 0 और 1. हैं
मुकुस

0

आप इस तरह से करने की कोशिश कर सकते हैं:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}

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