比较相等的NSDates会使它们返回不相等

时间:2013-03-15 11:25:17

标签: iphone ios objective-c nsdate

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

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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

     

参数

     

<强> anotherDate

The date to compare with the receiver.
     

返回值

     

如果anotherDate是NSDate对象并且完全等于   接收者,否则没有。

     

讨论

     

此方法检测日期之间的亚秒差异。如果你想   要比较不太精细的日期,请使用   timeIntervalSinceDate:比较两个日期

答案 2 :(得分:0)

它还与微秒进行比较,因此它给出的值为0。    timeIntervalSinceDate:此方法用于日期范围为微秒,秒等。

答案 3 :(得分:0)

date2date3关闭毫秒。

比较然后使用第二个精度执行此操作:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:NSSecondCalendarUnit fromDate:date2 toDate:date3 options:0];
if (comps.second == 0) {
    //do something
}