如何比较两个NSDates:哪个更近?

我正在尝试实现dropBox同步,并需要比较两个文件的date。 一个在我的dropBox帐户,一个在我的iPhone上。

我想出了以下,但我得到意想不到的结果。 当我比较两个date时,我想我正在做一些根本性的错误。 我简单地使用了> <运算符,但我想这是不好的,因为我比较两个NSDatestring。 开始了:

NSLog(@"dB...lastModified: %@", dbObject.lastModifiedDate); NSLog(@"iP...lastModified: %@", [self getDateOfLocalFile:@"NoteBook.txt"]); if ([dbObject lastModifiedDate] < [self getDateOfLocalFile:@"NoteBook.txt"]) { NSLog(@"...db is more up-to-date. Download in progress..."); [self DBdownload:@"NoteBook.txt"]; NSLog(@"Download complete."); } else { NSLog(@"...iP is more up-to-date. Upload in progress..."); [self DBupload:@"NoteBook.txt"]; NSLog(@"Upload complete."); } 

这给了我以下(随机和错误)输出:

 2011-05-11 14:20:54.413 NotePage[6918:207] dB...lastModified: 2011-05-11 13:18:25 +0000 2011-05-11 14:20:54.414 NotePage[6918:207] iP...lastModified: 2011-05-11 13:20:48 +0000 2011-05-11 14:20:54.415 NotePage[6918:207] ...db is more up-to-date. 

或者这个恰好是正确的:

 2011-05-11 14:20:25.097 NotePage[6903:207] dB...lastModified: 2011-05-11 13:18:25 +0000 2011-05-11 14:20:25.098 NotePage[6903:207] iP...lastModified: 2011-05-11 13:19:45 +0000 2011-05-11 14:20:25.099 NotePage[6903:207] ...iP is more up-to-date. 

我们假设两个date:

 NSDate *date1; NSDate *date2; 

然后下面的比较会告诉哪个是早/晚/同一个:

 if ([date1 compare:date2] == NSOrderedDescending) { NSLog(@"date1 is later than date2"); } else if ([date1 compare:date2] == NSOrderedAscending) { NSLog(@"date1 is earlier than date2"); } else { NSLog(@"dates are the same"); } 

有关更多详细信息,请参阅NSDate类文档 。

晚了,但比较NSDate对象的另一个简单的方法是将它们转换成原始types,允许方便地使用'>''''=='等

例如。

 if ([dateA timeIntervalSinceReferenceDate] > [dateB timeIntervalSinceReferenceDate]) { //do stuff } 

timeIntervalSinceReferenceDate将date转换为自引用date(2001年1月1日,GMT)以来的秒数。 当timeIntervalSinceReferenceDate返回一个NSTimeInterval(这是一个双重的typedef)时,我们可以使用基本的比较器。

NSDate有一个比较function。

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

 (NSComparisonResult)compare:(NSDate *)anotherDate 

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

返回值:

  • 如果接收者和另一个NSOrderedSame完全相等,则NSOrderedSame
  • 如果接收者晚于NSOrderedDescendingNSOrderedDescending
  • 如果接收者比NSOrderedAscending时间早, NSOrderedAscending

在Swift中,你可以超载现有的操作符:

 func > (lhs: NSDate, rhs: NSDate) -> Bool { return lhs.timeIntervalSinceReferenceDate > rhs.timeIntervalSinceReferenceDate } func < (lhs: NSDate, rhs: NSDate) -> Bool { return lhs.timeIntervalSinceReferenceDate < rhs.timeIntervalSinceReferenceDate } 

然后,您可以直接使用<>==比较NSDates(已经支持)。

你想使用NSDate比较:,laterDate :, earlierDate :,或isEqualToDate:方法。 在这种情况下使用<和>运算符是比较指针,而不是date

 - (NSDate *)earlierDate:(NSDate *)anotherDate 

这将返回接收者的更早和anotherDate。 如果两者都相同,则返回接收器。

一些date的工具,包括比较英文,这是很好的:

 #import <Foundation/Foundation.h> @interface NSDate (Util) -(BOOL) isLaterThanOrEqualTo:(NSDate*)date; -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date; -(BOOL) isLaterThan:(NSDate*)date; -(BOOL) isEarlierThan:(NSDate*)date; - (NSDate*) dateByAddingDays:(int)days; @end 

执行:

 #import "NSDate+Util.h" @implementation NSDate (Util) -(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); } - (NSDate *) dateByAddingDays:(int)days { NSDate *retVal; NSDateComponents *components = [[NSDateComponents alloc] init]; [components setDay:days]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; retVal = [gregorian dateByAddingComponents:components toDate:self options:0]; return retVal; } @end 

你应该使用:

 - (NSComparisonResult)compare:(NSDate *)anotherDate 

比较date。 目标C中没有操作符重载。

我遇到几乎相同的情况,但在我的情况下,我正在检查天数差异

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *compDate = [cal components:NSDayCalendarUnit fromDate:fDate toDate:tDate options:0]; int numbersOfDaysDiff = [compDate day]+1; // do what ever comparison logic with this int. 

当您需要以天/月/年单位比较NSDate时有用

为什么你们不使用这些NSDate比较方法:

 - (NSDate *)earlierDate:(NSDate *)anotherDate; - (NSDate *)laterDate:(NSDate *)anotherDate; 

你也可以用这个方法比较两个date

  switch ([currenttimestr compare:endtimestr]) { case NSOrderedAscending: // dateOne is earlier in time than dateTwo break; case NSOrderedSame: // The dates are the same break; case NSOrderedDescending: // dateOne is later in time than dateTwo break; } 

我试过了,希望它适合你

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; int unitFlags =NSDayCalendarUnit; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; NSDate *myDate; //= [[NSDate alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; myDate = [dateFormatter dateFromString:self.strPrevioisDate]; NSDateComponents *comps = [gregorian components:unitFlags fromDate:myDate toDate:[NSDate date] options:0]; NSInteger day=[comps day]; 

使用这个简单的function进行date比较

 -(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{ BOOL isTokonValid; if ([date1 compare:date2] == NSOrderedDescending) { NSLog(@"date1 is later than date2"); isTokonValid = YES; } else if ([date1 compare:date2] == NSOrderedAscending) { NSLog(@"date1 is earlier than date2"); isTokonValid = NO; } else { isTokonValid = NO; NSLog(@"dates are the same"); } return isTokonValid;}