यदि कोई खाता 30 दिनों से कम समय में समाप्त होता है, तो मैं काम करने की कोशिश कर रहा हूं। क्या मैं DateTime की तुलना सही ढंग से कर रहा हूं?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
यदि कोई खाता 30 दिनों से कम समय में समाप्त होता है, तो मैं काम करने की कोशिश कर रहा हूं। क्या मैं DateTime की तुलना सही ढंग से कर रहा हूं?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
जवाबों:
क्या मैं DateTime की तुलना सही ढंग से कर रहा हूं?
नहीं, Compare
केवल दो तिथियों की सापेक्ष स्थिति के बारे में जानकारी प्रदान करता है: कम, बराबर या अधिक। आप जो चाहते हैं वह कुछ इस तरह है:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
यह दो DateTime
एस घटाता है । परिणाम एक TimeSpan
वस्तु है जिसमें एक TotalDays
संपत्ति है।
इसके अतिरिक्त, सशर्त को सीधे रूप में लिखा जा सकता है:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
कोई if
जरूरत नहीं ।
Days
सबसे बड़ा घटक है TimeSpan
। इसे पढ़ने वाले लोग यह अनुमान लगा सकते हैं कि यह सोचने के लिए कि Seconds
संपत्ति उसी तरह से काम करती है।
Days
खुद भी गलत हो सकता है। Days
और TotalDays
यहां केवल वही हैं क्योंकि स्थिति है < 30
, लेकिन अगर यह था <= 30
, तो एक स्पष्ट अंतर होगा , क्योंकि TotalDays
रिटर्न 30.421
करते समय ऐसा कुछ हो सकता Days
है 30
।
होना चाहिए
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
कुल दिनों पर ध्यान दें अन्यथा आपको वरीद व्यवहार मिलेगा
TotalDays
का उपयोग करने के लिए वैचारिक रूप से सही क्षेत्र है। व्यवहार में वे एक ही परिणाम देते हैं लेकिन केवल इसलिए Days
कि सबसे बड़ा घटक है TimeSpan
, एक महीने या वर्षों का घटक था और यह एक अलग कहानी होगी। बस के साथ प्रयास करें Hours
, Seconds
या Milliseconds
यह देखने के लिए कि वे कैसे काम करते हैं।
इसके बजाय यह प्रयास करें
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
यह आपको सटीक परिणाम देगा:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
तुलना अनावश्यक है, दिन / TotalDays अनावश्यक हैं।
जो तुम्हे चाहिए वो है
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
ध्यान दें कि यह तब काम करेगा जब आप अपने एक्सपायरी मापदंड के रूप में मिनटों या महीनों या वर्षों का उपयोग करने का निर्णय लेते हैं।
यदि आप false
(यदि लागू हो) असाइन करना चाहते हैं, तो matchtime
इसे लिखने का एक सरल तरीका होगा।
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
नहीं, तुलना फ़ंक्शन 1, 0, या -1 पर वापस आ जाएगा। 0 जब दो मान समान होते हैं, -1 और 1 का मतलब इससे कम और अधिक होता है, तो मैं उस क्रम में विश्वास करता हूं, लेकिन मैं अक्सर उन्हें मिलाता हूं।
नहीं, आप इसका सही उपयोग नहीं कर रहे हैं।
देखें यहाँ जानकारी के लिए।
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");
वास्तव में इनमें से किसी भी उत्तर ने मेरे लिए काम नहीं किया। मैंने इसे इस तरह से हल किया:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
जब मैंने ऐसा करने की कोशिश की:
matchFound = (expiryDate - DateTime.Now).Days < 30;
आज, 2011-11-14 और मेरी एक्सपायरी डेट 2011-10-17 थी, मुझे वह मैचफाउंड = -28 मिला। 28 के बजाय। इसलिए मैंने आखिरी चेक का इस्तेमाल किया।
// 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;
}
}