如何比较Objective-C中的两个date

我有两个date: 2009-05-11和当前date。 我想检查给定的date是否是当前date。 这怎么可能。

cocoa有几个方法 :

在NSDate

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

当你使用- (NSComparisonResult)compare:(NSDate *)anotherDate ,你会得到其中的一个:

 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. 

例:

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

这里哥们。 此function会将您的date与任何指定的date相匹配,并会告诉您天气是否匹配。 您还可以修改组件以符合您的要求。

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

问候,Naveed屁股

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

还有其他的方法可以用来比较一个NSDate对象。 在某些任务中,每种方法都会更有效率。 我select了比较方法,因为它将处理大部分基本date比较需求。

这个类别提供了一个比较NSDates的方法:

 #import <Foundation/Foundation.h> @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 

并执行:

 #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 

简单易用:

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

通过这种方法也可以比较两个date

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

如果你使两个dateNSDate s你可以使用NSDatecompare:方法:

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

你可以看看这里的文档。

我发现的最好的方法是检查给定的date和今天之间的差异:

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

根据苹果date和时间编程指南中的日历计算列表13 [NSCalendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:myDate]给出了自时代开始以来的中午数量。 这样就很容易检查date是昨天,今天还是明天。

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

享受编码……

你真正需要的是比较两个同类的对象。

  1. 从stringdate(@“2009-05-11”)中创build一个NSDate:
    http://blog.evandavey.com/2008/12/how-to-convert-a-string-to-nsdate.html

  2. 如果当前date也是一个string,使它成为一个NSDate。 如果它已经是一个NSDate,离开它。

这是帕斯卡答案中的Swift变体:

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

可以用作:

 self.expireDate.isEarlierThanOrEqualTo(NSDate()) 

如果其他人正在寻找的话,那么将Naveed Rafi的答案转换成Swift的函数:

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

然后使用NSComparisonResult比较date。

..

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