【问题标题】:Comparing equal NSDates is returning them as not equal比较相等的 NSDates 将它们返回为不相等
【发布时间】:2013-03-15 11:25:17
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以用这个 [date3 compare:date2] ==NSOrderedSame 检查两个 nsdates
  • date3 如何获得价值?
  • 您的精度可能不够。检查 [date2 timeIntervalSince1970] == [date3 timeIntervalSince1970]
  • 这个答案解释了它stackoverflow.com/questions/5823486/…
  • 我使用了相同的代码,并且得到相等:1

标签: iphone ios objective-c nsdate


【解决方案1】:

试试这个..

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;
}

【讨论】:

    【解决方案2】:

    请检查:

    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 对象并且完全等于 接收者,否则否。

    讨论

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        date2date3 以毫秒为单位关闭。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-18
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          相关资源
          最近更新 更多