Come confrontare due date in Objective-C

Ho due date: 2009-05-11 e la data corrente. Voglio controllare se la data data è la data corrente o no. Com’è ansible.

Cocoa ha un paio di metodi per questo :

in NSDate

 – isEqualToDate: – earlierDate: – laterDate: – compare: 

Quando si utilizza - (NSComparisonResult)compare:(NSDate *)anotherDate , si ottiene uno di questi:

 The receiver and anotherDate are exactly equal to each other, NSOrderedSame The receiver is later in time than anotherDate, NSOrderedDescending The receiver is earlier in time than anotherDate, NSOrderedAscending. 

esempio:

 NSDate * now = [NSDate date]; NSDate * mile = [[NSDate alloc] initWithString:@"2001-03-24 10:45:32 +0600"]; NSComparisonResult result = [now compare:mile]; NSLog(@"%@", now); NSLog(@"%@", mile); switch (result) { case NSOrderedAscending: NSLog(@"%@ is in future from %@", mile, now); break; case NSOrderedDescending: NSLog(@"%@ is in past from %@", mile, now); break; case NSOrderedSame: NSLog(@"%@ is the same as %@", mile, now); break; default: NSLog(@"erorr dates %@, %@", mile, now); break; } [mile release]; 

Qui amico. Questa funzione corrisponderà alla data con qualsiasi data specificata e indicherà il tempo che corrispondono o meno. È inoltre ansible modificare i componenti in base alle proprie esigenze.

 - (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 { NSCalendar* calendar = [NSCalendar currentCalendar]; unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1]; NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2]; return [comp1 day] == [comp2 day] && [comp1 month] == [comp2 month] && [comp1 year] == [comp2 year];} 

Saluti, Naveed Butt

 NSDate *today = [NSDate date]; // it will give you current date NSDate *newDate = [NSDate dateWithString:@"xxxxxx"]; // your date NSComparisonResult result; //has three possible values: NSOrderedSame,NSOrderedDescending, NSOrderedAscending result = [today compare:newDate]; // comparing two dates if(result==NSOrderedAscending) NSLog(@"today is less"); else if(result==NSOrderedDescending) NSLog(@"newDate is less"); else NSLog(@"Both dates are same"); 

Esistono altri modi che è ansible utilizzare per confrontare un object NSDate. Ciascuno dei metodi sarà più efficiente in determinati compiti. Ho scelto il metodo di confronto perché gestirà la maggior parte delle esigenze di confronto delle date di base.

Questa categoria offre un modo semplice per confrontare NSDate:

 #import  @interface NSDate (Compare) -(BOOL) isLaterThanOrEqualTo:(NSDate*)date; -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date; -(BOOL) isLaterThan:(NSDate*)date; -(BOOL) isEarlierThan:(NSDate*)date; //- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API @end 

E l’implementazione:

 #import "NSDate+Compare.h" @implementation NSDate (Compare) -(BOOL) isLaterThanOrEqualTo:(NSDate*)date { return !([self compare:date] == NSOrderedAscending); } -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date { return !([self compare:date] == NSOrderedDescending); } -(BOOL) isLaterThan:(NSDate*)date { return ([self compare:date] == NSOrderedDescending); } -(BOOL) isEarlierThan:(NSDate*)date { return ([self compare:date] == NSOrderedAscending); } @end 

Semplice da usare:

 if([aDateYouWantToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now { // do your thing ... } 

Se NSDate entrambe le date NSDate puoi utilizzare il NSDate di compare: NSDate :

 NSComparisonResult result = [Date2 compare:Date1]; if(result==NSOrderedAscending) NSLog(@"Date1 is in the future"); else if(result==NSOrderedDescending) NSLog(@"Date1 is in the past"); else NSLog(@"Both dates are the same"); 

Puoi dare un’occhiata ai documenti qui .

Con questo metodo puoi anche confrontare due date

 NSDate * dateOne = [NSDate date]; NSDate * dateTwo = [NSDate date]; if([dateOne compare:dateTwo] == NSOrderedAscending) { } 

Il modo migliore che ho trovato è stato quello di verificare la differenza tra la data data e oggi:

 NSCalendar* calendar = [NSCalendar currentCalendar]; NSDate* now = [NSDate date]; int differenceInDays = [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:date] - [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:now]; 

Secondo il Listato 13 dei Calcoli Calendari nella Guida alla programmazione di data e ora di Apple [NSCalendar ordinalityOfUnit: NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate: myDate] ti dà il numero di midnights dall’inizio dell’era. In questo modo è facile verificare se la data è ieri, oggi o domani.

 switch (differenceInDays) { case -1: dayString = @"Yesterday"; break; case 0: dayString = @"Today"; break; case 1: dayString = @"Tomorrow"; break; default: { NSDateFormatter* dayFormatter = [[NSDateFormatter alloc] init]; [dayFormatter setLocale:usLocale]; [dayFormatter setDateFormat:@"dd MMM"]; dayString = [dayFormatter stringFromDate: date]; break; } } 
 NSDateFormatter *df= [[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy-MM-dd"]; NSDate *dt1 = [[NSDate alloc] init]; NSDate *dt2 = [[NSDate alloc] init]; dt1=[df dateFromString:@"2011-02-25"]; dt2=[df dateFromString:@"2011-03-25"]; NSComparisonResult result = [dt1 compare:dt2]; switch (result) { case NSOrderedAscending: NSLog(@"%@ is greater than %@", dt2, dt1); break; case NSOrderedDescending: NSLog(@"%@ is less %@", dt2, dt1); break; case NSOrderedSame: NSLog(@"%@ is equal to %@", dt2, dt1); break; default: NSLog(@"erorr dates %@, %@", dt2, dt1); break; } 

Goditi la codifica ……

Quello di cui hai veramente bisogno è confrontare due oggetti dello stesso tipo.

  1. Crea un NSDate al di fuori della data della stringa (@ “2009-05-11”):
    http://blog.evandavey.com/2008/12/how-to-convert-a-string-to-nsdate.html

  2. Se la data corrente è anche una stringa, rendila un NSDate. Se è già un NSDate, lascialo.

Ecco la variante di Swift sulla risposta di Pascal:

 extension NSDate { func isLaterThanOrEqualTo(date:NSDate) -> Bool { return !(self.compare(date) == NSComparisonResult.OrderedAscending) } func isEarlierThanOrEqualTo(date:NSDate) -> Bool { return !(self.compare(date) == NSComparisonResult.OrderedDescending) } func isLaterThan(date:NSDate) -> Bool { return (self.compare(date) == NSComparisonResult.OrderedDescending) } func isEarlierThan(date:NSDate) -> Bool { return (self.compare(date) == NSComparisonResult.OrderedAscending) } } 

Che può essere usato come:

 self.expireDate.isEarlierThanOrEqualTo(NSDate()) 

Ecco la funzione della risposta di Naveed Rafi convertita in Swift se qualcun altro la sta cercando:

 func isSameDate(#date1: NSDate, date2: NSDate) -> Bool { let calendar = NSCalendar() let date1comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date1) let date2comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date2) return (date1comp.year == date2comp.year) && (date1comp.month == date2comp.month) && (date1comp.day == date2comp.day) } 
 Get Today's Date: NSDate* date = [NSDate date]; Create a Date From Scratch: NSDateComponents* comps = [[NSDateComponents alloc]init]; comps.year = 2015; comps.month = 12; comps.day = 31; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDate* date = [calendar dateFromComponents:comps]; Add a day to a Date: NSDate* date = [NSDate date]; NSDateComponents* comps = [[NSDateComponents alloc]init]; comps.day = 1; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDate* tomorrow = [calendar dateByAddingComponents:comps toDate:date options:nil]; Subtract a day from a Date: NSDate* date = [NSDate date]; NSDateComponents* comps = [[NSDateComponents alloc]init]; comps.day = -1; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDate* yesterday = [calendar dateByAddingComponents:comps toDate:date options:nil]; Convert a Date to a String: NSDate* date = [NSDate date]; NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; formatter.dateFormat = @"MMMM dd, yyyy"; NSString* dateString = [formatter stringFromDate:date]; Convert a String to a Date: NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; formatter.dateFormat = @"MMMM dd, yyyy"; NSDate* date = [formatter dateFromString:@"August 02, 2014"]; Find how many days are in a month: NSDate* date = [NSDate date]; NSCalendar* cal = [NSCalendar currentCalendar]; NSRange currentRange = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date]; NSInteger numberOfDays = currentRange.length; Calculate how much time something took: NSDate* start = [NSDate date]; for(int i = 0; i < 1000000000; i++); NSDate* end = [NSDate date]; NSTimeInterval duration = [end timeIntervalSinceDate:start]; Find the Day Of Week for a specific Date: NSDate* date = [NSDate date]; NSCalendar* cal = [NSCalendar currentCalendar]; NSInteger dow = [cal ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date]; 

Quindi utilizzare NSComparisonResult per confrontare la data.

..

 NSString *date = @"2009-05-11" NSString *nowDate = [[[NSDate date]description]substringToIndex: 10]; if([date isEqualToString: nowDate]) { // your code }