iOS:比较两个date
我有一个NSDate
,我必须与其他两个NSDate
比较,我尝试使用NSOrderAscending
和NSOrderDescending
但如果我的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:)