iOS:比较两个没有时间部分的NSDate

我想比较两个date:date1和date2

2011-06-06 12:59:48.994 Project[419:707] firstDate:2011-06-06 10:59:21 +0000 2011-06-06 12:59:49.004 Project[419:707] selectedData:2011-06-06 10:59:17 +0000 

但这些date有不同的时间,当我使用NSOrderedSame它不能正常工作,我怎么解决?

我的代码:

 NSDate *firstDate = [[appDelegate.project objectAtIndex:i]objectAtIndex:3]; NSDate *secondDate = [[appDelegate.project objectAtIndex:i]objectAtIndex:4]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit); NSDateComponents *date1Components = [calendar components:comps fromDate:firstDate]; NSDateComponents *date2Components = [calendar components:comps fromDate:secondDate]; NSDateComponents *date3Components = [calendar components:comps fromDate:appDelegate.selectedDate]; NSLog(@"firstDate:%@", [date1Components date]); NSLog(@"secondDate:%@", [date2Components date]); NSLog(@"selectedData:%@", [date3Components date]); NSComparisonResult compareStart = [[date1Components date] compare: [date3Components date]]; NSComparisonResult compareEnd = [[date2Components date] compare: [date3Components date]]; if ((compareStart == NSOrderedAscending || compareStart == NSOrderedSame) && (compareEnd == NSOrderedDescending || compareEnd == NSOrderedSame)) { NSLog(@"inside"); 

然后我想比较我的date和条目里面的“如果”date1 <= selectedDate <= date2; 现在我明白了,因为我有一个警告:我应该添加这个“[date1Componentsdate]”,它的工作; 问题是我在NSLog中有空值,为什么?

 NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger comps = (NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear); NSDateComponents *date1Components = [calendar components:comps fromDate: date1]; NSDateComponents *date2Components = [calendar components:comps fromDate: date2]; date1 = [calendar dateFromComponents:date1Components]; date2 = [calendar dateFromComponents:date2Components]; NSComparisonResult result = [date1 compare:date2]; if (result == NSOrderedAscending) { } else if (result == NSOrderedDescending) { } else { //the same } 

还有一个方便的方法可以为给定的date创build一个代表给定单元开始的date: [aCalendar rangeOfUnit:startDate:interval:forDate:]
为了说明这个方法是如何工作的,请看这个代码,它可以很容易地为给定的date(这里:现在)创build一天,一周,一个月和一年的开始date。

 NSDate *now = [NSDate date]; NSDate *startOfToday = nil; NSDate *startOfThisWeek = nil; NSDate *startOfThisMonth = nil; NSDate *startOfThisYear = nil; [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now]; [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startOfThisWeek interval:NULL forDate:now]; [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startOfThisMonth interval:NULL forDate:now]; [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startOfThisYear interval:NULL forDate:now]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterFullStyle]; [formatter setTimeStyle:NSDateFormatterFullStyle]; NSLog(@"%@", [formatter stringFromDate:now]); NSLog(@"%@", [formatter stringFromDate:startOfToday]); NSLog(@"%@", [formatter stringFromDate:startOfThisWeek]); NSLog(@"%@", [formatter stringFromDate:startOfThisMonth]); NSLog(@"%@", [formatter stringFromDate:startOfThisYear]); 

结果:

 Thursday, July 12, 2012, 4:36:07 PM Central European Summer Time Thursday, July 12, 2012, 12:00:00 AM Central European Summer Time Sunday, July 8, 2012, 12:00:00 AM Central European Summer Time Sunday, July 1, 2012, 12:00:00 AM Central European Summer Time Sunday, January 1, 2012, 12:00:00 AM Central European Standard Time 

这可以让我们缩短第一个代码来:

 [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date1 interval:NULL forDate:date1]; [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date2 interval:NULL forDate:date2]; NSComparisonResult result = [date1 compare:date2]; if (result == NSOrderedAscending) { } else if (result == NSOrderedDescending) { } else { //the same } 

请注意,在此代码中, date1date2将被覆盖。 或者,你可以传入一个引用startDate另一个NSDate指针,如上面的代码所示, now保持不变。

我已经使用NSDateFormatter和string比较的另一种方法,比NSDate 比较方法更聪明,但更快的编写和足够灵活,做各种比较:

 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyy-MM-dd"]; if ([[dateFormat stringFromDate:date1] isEqualToString:[dateFormat stringFromDate:date2]]) { //It's the same day } 

迅捷版 ,比较date和忽略他们的时间。

 let dateExam1:NSDate = NSDate.init(timeIntervalSinceNow: 300) let dateExam2:NSDate = NSDate.init(timeIntervalSinceNow: 10000) let currCalendar = NSCalendar.currentCalendar() let dateCompanent1:NSDateComponents = currCalendar.components([.Year,.Month,.Day], fromDate: dateExam1) let dateCompanent2:NSDateComponents = currCalendar.components([.Year,.Month,.Day], fromDate: dateExam2) let date1WithoutTime:NSDate? = currCalendar .dateFromComponents(dateCompanent1) let date2WithoutTime:NSDate? = currCalendar .dateFromComponents(dateCompanent2) if (date1WithoutTime != nil) && (date2WithoutTime != nil) { let dateCompResult:NSComparisonResult = date1WithoutTime!.compare(date2WithoutTime!) if (dateCompResult == NSComparisonResult.OrderedSame) { print("Same Dates") } else { print("Different Dates") } } 

好吧,原来的问题已经过了几年了,但值得一提的是, NSCalendar现在有很多方法可以使得某些date比较问题变得更直接:

 NSCalendar *currentCalendar = [NSCalendar currentCalendar]; Bool sameDay = [currentCalendar isDate:dateA inSameDayAsDate:dateB];