2

我取一个日期并为其创建一个新指针,然后将其与另一个具有相同价值的日期进行比较。它将此报告为同一日期,但声称它们不匹配:

NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSince1970:[date1 timeIntervalSince1970]];
NSLog(@"date 2: %@", date2);
NSLog(@"date 3: %@", date3);
NSLog(@"equal: %i", [date2 isEqualToDate:date3]);

这是 NSLog:

date 2: 2013-03-15 11:12:24 +0000
date 3: 2013-03-15 11:12:24 +0000
equal: 0

知道为什么这些返回不相等吗?

4

4 回答 4

2

尝试这个..

NSComparisonResult result = [date1 compare:date2]; // comparing two dates
switch (result) {
  case NSOrderedAscending:
    InfoLog(@"date1 is less");
    break;
  case NSOrderedDescending:
    InfoLog(@"date1 is greater");
    break;
  case NSOrderedSame:
    InfoLog(@"same date");
    break;
  default:
    break;
}
于 2013-03-15T11:29:16.107 回答
1

请检查:

NSCalendar *calendar         = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date2];
NSDate *date2New             = [calendar dateFromComponents:components];
components                   = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date3];
NSDate *date3New             = [calendar dateFromComponents:components];

if([date2New isEqualToDate:date3New])
{
   //do stuffs
}

我认为您的代码中的问题是, isEqualToDate: 将检查完全相同的日期(亚秒级差异也会导致条件失败)

根据NSDate

isEqualToDate:

返回一个布尔值,指示给定对象是否是 NSDate 对象并且完全等于接收者。 - (BOOL)isEqualToDate:(NSDate *)anotherDate

参数

另一个日期

The date to compare with the receiver.

返回值

如果 anotherDate 是一个 NSDate 对象并且完全等于接收者,则为 YES,否则为 NO。

讨论

此方法检测日期之间的亚秒级差异。如果要比较粒度较小的日期,请使用 timeIntervalSinceDate: 比较两个日期

于 2013-03-15T11:31:51.173 回答
0

它也与微秒进行比较,因此它给出的值类似于 0。 timeIntervalSinceDate:此方法用于日期在微秒、秒等范围内。

于 2013-03-15T11:38:07.870 回答
0

date2date3以毫秒为单位关闭。

比较然后使用第二精度这样做:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:NSSecondCalendarUnit fromDate:date2 toDate:date3 options:0];
if (comps.second == 0) {
    //do something
}
于 2013-03-15T19:10:50.660 回答