आईओएस: दो तारीखों की तुलना करें


96

मैं एक है NSDateकि मैं अन्य दो के साथ तुलना करना चाहिए NSDateऔर मैं के साथ प्रयास करें NSOrderAscendingऔर NSOrderDescendingलेकिन मेरी तारीख अन्य दो तिथियों पर बराबर है तो क्या होगा?

उदाहरण: यदि मेरे पास एक myDate = 24/05/2011 और अन्य दो हैं जो एक = 24/05/2011और दो 24/05/2011हैं तो मैं क्या उपयोग कर सकता हूं?


1
मैं आपके सवाल को पूरी तरह से नहीं समझ पा रहा हूँ, आप क्या हासिल करने की कोशिश कर रहे हैं?
ArcLight

तारीख एक और तारीख दो एक = 15/05/2011 और दो = 31/05/2011 हो सकते हैं, लेकिन वे भी एक ही दिन एक = 24/05/2011 और दो = 24/05/2011 होना चाहिए तो मुझे जाँच करनी चाहिए कि क्या myData
चुकंदर

बस वर्ष, महीना और तारीख निकालें और उस क्रम में उनकी तुलना करें। यदि कोई टाई है तो अगले क्षेत्र की तुलना करें।
हिमाद्री चौधरी

जवाबों:


210

के Apple प्रलेखन के अनुसारNSDate compare:

एक NSComparisonResult मान लौटाता है जो रिसीवर के अस्थायी आदेश और एक और दी गई तारीख को इंगित करता है।

- (NSComparisonResult)compare:(NSDate *)anotherDate

पैरामीटर anotherDate

जिस तारीख के साथ रिसीवर की तुलना करना है। यह मान शून्य नहीं होना चाहिए। यदि मान शून्य है, तो व्यवहार अपरिभाषित है और मैक ओएस एक्स के भविष्य के संस्करणों में बदल सकता है।

प्रतिलाभ की मात्रा

अगर:

रिसीवर और अन्यडेट एक दूसरे के बराबर हैं, NSOrderedSame

रिसीवर बाद में किसी अन्य दिनांक की तुलना में समय पर है, NSOrderedDescending

रिसीवर किसी अन्य दिनांक से पहले के समय में है, NSOrderedAscending

दूसरे शब्दों में:

if ([date1 compare:date2] == NSOrderedSame) ...

ध्यान दें कि इसे पढ़ना और लिखना आपके विशेष मामले में आसान हो सकता है:

if ([date2 isEqualToDate:date2]) ...

इस एक के बारे में Apple प्रलेखन देखें ।


लेकिन f ([date1 तुलना: date2] == NSOrderedSame) घंटे मिनट और सेकंड की भी जाँच करें और मुझे यह नहीं चाहिए
साइकिल चलाना

1
आप सवाल थोड़ा अस्पष्ट क्षमा करें, stackoverflow.com/questions/1889164/3092009#3092009 पर एक नज़र डालें , आपको इसका उत्तर मिल जाएगा।
विंसेंट गूरसी

यह उत्तर दोनों तरह से सही है। आपके द्वारा उपयोग किए जा रहे दिनांक घटकों को नियंत्रित करने के लिएNSDateComponents
नाज़िर

32

स्टैकओवरफ़्लो और वेब को बहुत खोजने के बाद, मुझे इस बात पर सहमति हुई है कि इसे करने का सबसे अच्छा तरीका इस प्रकार है:

- (BOOL)isEndDateIsSmallerThanCurrent:(NSDate *)checkEndDate
{
    NSDate* enddate = checkEndDate;
    NSDate* currentdate = [NSDate date];
    NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate];
    double secondsInMinute = 60;
    NSInteger secondsBetweenDates = distanceBetweenDates / secondsInMinute;

    if (secondsBetweenDates == 0)
        return YES;
    else if (secondsBetweenDates < 0)
        return YES;
    else
        return NO;
}

आप इसे घंटों के अंतर में भी बदल सकते हैं।

का आनंद लें!


संपादित करें 1

यदि आप केवल dd / MM / yyyy के प्रारूप के साथ तारीख की तुलना करना चाहते हैं, तो आपको NSDate* currentdate = [NSDate date];&& के बीच नीचे की पंक्तियों को जोड़ना होगाNSTimeInterval distance

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]
                          autorelease]];

NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]];

currentdate = [dateFormatter dateFromString:stringDate];

1
धन्यवाद इस तुलना की तुलना में बेहतर काम करता है या isEqualToDate
ArdenDev

माना। मुझे तुलना और isEqualToDate का उपयोग करने में समस्याएं मिली हैं। ज़रूर, यह कोड की एक अतिरिक्त 2 पंक्तियाँ हो सकती हैं, लेकिन यह अधिक विश्वसनीय है।
कोच Roebuck

23

मैं इसे लेता हूं आप पूछ रहे हैं कि तुलना फ़ंक्शन में रिटर्न वैल्यू क्या है।

अगर तारीखें बराबर हैं तो वापस लौटेंगे NSOrderedSame

यदि आरोही (दूसरा arg> 1st arg) वापस लौटा NSOrderedAscending

यदि अवरोही (दूसरा arg <1st arg) वापस आता है NSOrderedDescending


आरोही और उतरते हुए सोचने का अच्छा तरीका।
डेविड

16

मुझे नहीं पता कि आपने यह पूछा है, लेकिन यदि आप केवल NSDate के दिनांक घटक की तुलना करना चाहते हैं तो आपको समय घटक को निकालने के लिए NSCalendar और NSDateCompords का उपयोग करना होगा।

कुछ इस तरह से एनएसडी के लिए एक श्रेणी के रूप में काम करना चाहिए:

- (NSComparisonResult)compareDateOnly:(NSDate *)otherDate {
    NSUInteger dateFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit;
    NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents *selfComponents = [gregorianCalendar components:dateFlags fromDate:self];
    NSDate *selfDateOnly = [gregorianCalendar dateFromComponents:selfComponents];

    NSDateComponents *otherCompents = [gregorianCalendar components:dateFlags fromDate:otherDate];
    NSDate *otherDateOnly = [gregorianCalendar dateFromComponents:otherCompents];
    return [selfDateOnly compare:otherDateOnly];
}

2

NSDateवास्तव में एक संदर्भ दिनांक (1 जनवरी 2000 UTC मुझे लगता है) के बाद से सेकंड में समय अंतराल का प्रतिनिधित्व करता है। आंतरिक रूप से, एक डबल सटीक फ़्लोटिंग पॉइंट नंबर का उपयोग किया जाता है, इसलिए दो मनमाना तिथियां समान तुलना की संभावना नहीं हैं, भले ही वे एक ही दिन हों। यदि आप यह देखना चाहते हैं कि क्या कोई विशेष तिथि किसी विशेष दिन में आती है, तो आपको संभवतः उपयोग करने की आवश्यकता है NSDateComponents। जैसे

NSDateComponents* dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear: 2011];
[dateComponents setMonth: 5];
[dateComponents setDay: 24];
/*
 *  Construct two dates that bracket the day you are checking.  
 *  Use the user's current calendar.  I think this takes care of things like daylight saving time.
 */
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* startOfDate = [calendar dateFromComponents: dateComponents];
NSDateComponents* oneDay = [[NSDateComponents alloc] init];
[oneDay setDay: 1];
NSDate* endOfDate = [calendar dateByAddingComponents: oneDay toDate: startOfDate options: 0];
/*
 *  Compare the date with the start of the day and the end of the day.
 */
NSComparisonResult startCompare = [startOfDate compare: myDate];
NSComparisonResult endCompare = [endOfDate compare: myDate];

if (startCompare != NSOrderedDescending && endCompare == NSOrderedDescending)
{
    // we are on the right date
} 

2

तारीख की तुलना के लिए निम्नलिखित फ़ंक्शन की जांच करें सबसे पहले दो एनएसडी ऑब्जेक्ट बनाएं और फ़ंक्शन को पास करें: कोड के बोल्ड लाइनों को व्यूडोड में या अपने परिदृश्य के अनुसार जोड़ें।

-(void)testDateComaparFunc{

NSString *getTokon_Time1 = @"2016-05-31 03:19:05 +0000";
NSString *getTokon_Time2 = @"2016-05-31 03:18:05 +0000";
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss Z"];
NSDate *tokonExpireDate1=[dateFormatter dateFromString:getTokon_Time1];
NSDate *tokonExpireDate2=[dateFormatter dateFromString:getTokon_Time2];
BOOL isTokonValid = [self dateComparision:tokonExpireDate1 andDate2:tokonExpireDate2];}

यहाँ समारोह है

-(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{

BOOL isTokonValid;

if ([date1 compare:date2] == NSOrderedDescending) {
    //"date1 is later than date2
    isTokonValid = YES;
} else if ([date1 compare:date2] == NSOrderedAscending) {
    //date1 is earlier than date2
    isTokonValid = NO;
} else {
   //dates are the same
    isTokonValid = NO;

}

return isTokonValid;}

बस दिनांक बदलें और फ़ंक्शन के ऊपर परीक्षण करें :)

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