iOS:比较两个date

我有一个NSDate ,我必须与其他两个NSDate比较,我尝试使用NSOrderAscendingNSOrderDescending但如果我的date在其他两个date是相等的?

例如:如果我有一个myDate = 24/05/2011和其他两个是一个= 24/05/2011和两个24/05/2011我可以使用什么?

根据NSDate compare: Apple文档NSDate compare:

返回一个NSComparisonResult值,该值指示接收者的时间顺序和另一个给定的date。

- (NSComparisonResult)compare:(NSDate *)anotherDate

参数 anotherDate

与接收者进行比较的date。 这个值不能为零。 如果值为零,则行为未定义,并可能在未来版本的Mac OS X中更改。

返回值

如果:

接收者和另一个NSOrderedSame完全相等, NSOrderedSame

接收者晚于其他date, NSOrderedDescending

接收者比NSOrderedAscending时间更早, NSOrderedAscending

换一种说法:

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

请注意,在您的特定情况下读取和写入可能会更容易:

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

请参阅Apple文档了解这一点 。

在searchstackoverflow和web之后,我必须弄清楚最好的方法是这样的:

 - (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

如果您想仅将date与格式为dd / MM / yyyy进行比较,则需要在NSDate* currentdate = [NSDate date];之间添加下面的行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]; 

我认为你是在比较函数中询问返回值是什么。

如果date相等,则返回NSOrderedSame

如果升序(2nd arg> 1st arg)返回NSOrderedAscending

如果降序(2nd arg <1st arg)则返回NSOrderedDescending

我不知道你是否问过这个问题,但是如果你只想比较一个NSDate的date组件,你必须使用NSCalendar和NSDateComponents来删除时间组件。

像这样的东西应该作为NSDate的一个类别:

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

NSDate实际上代表了自参考date(2000年1月1日UTC我认为)以秒为单位的时间间隔。 在内部,使用双精度浮点数,所以即使在同一天,两个任意date也不太可能相等。 如果您想查看特定date是否属于特定date,则可能需要使用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 } 

首先检查下面的函数进行date比较创build两个NSDate对象并传递给函数:在viewDidload中添加下面的代码行或根据您的场景添加代码。

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

这是function

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

只需更改date和testing以上function:)