Como comparar duas datas no Objective-C

Eu tenho duas datas: 2009-05-11 e a data atual. Eu quero verificar se a data indicada é a data atual ou não. Como isso é possível.

cocoa tem alguns methods para isso :

em NSDate

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

Quando você usa - (NSComparisonResult)compare:(NSDate *)anotherDate , você recebe de volta um destes:

 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. 

exemplo:

 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]; 

Aqui amigo. Esta function irá corresponder a sua data com qualquer data especificada e irá dizer o tempo que eles combinam ou não. Você também pode modificar os componentes para atender aos seus requisitos.

 - (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];} 

Cumprimentos, 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"); 

Existem outras maneiras que você pode usar para comparar objects NSDate. Cada um dos methods será mais eficiente em determinadas tarefas. Eu escolhi o método de comparação porque ele irá lidar com a maioria das suas necessidades básicas de comparação de datas.

Esta categoria oferece uma maneira simples de comparar os NSDates:

 #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 a implementação:

 #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 

Simples de usar:

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

Se você fizer as duas datas da NSDate você pode usar a NSDate da 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"); 

Você pode dar uma olhada nos documentos aqui .

Por este método também você pode comparar duas datas

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

A melhor maneira que encontrei foi verificar a diferença entre a data indicada e hoje:

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

De acordo com a Listagem 13 de Calendrical Calculations no Guia de programação de data e hora da Apple [NSCalendar ordinalityOfUnit: NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate: myDate] fornece o número de noites intermediárias desde o início da era. Desta forma, é fácil verificar se a data é ontem, hoje ou amanhã.

 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; } 

Aprecie a codificação ……

O que você realmente precisa é comparar dois objects do mesmo tipo.

  1. Crie um NSDate fora da data da sua string (@ “2009-05-11”):
    http://blog.evandavey.com/2008/12/how-to-convert-a-string-to-nsdate.html

  2. Se a data atual também for uma string, torne-a um NSDate. Se já é um NSDate, deixe-o.

Aqui está a variante Swift na resposta de 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) } } 

Que pode ser usado como:

 self.expireDate.isEarlierThanOrEqualTo(NSDate()) 

Aqui está a function da resposta de Naveed Rafi convertida para Swift se alguém mais estiver procurando por ela:

 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]; 

Em seguida, use NSComparisonResult para comparar a data.

..

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