NSDate比较是假的?

时间:2012-09-13 14:49:36

标签: objective-c

我比较2个相同的NSDates,我得到错误的结果。 我不知道如何得到这个日期,因为它太长了,但我可以表明我做了什么:

NSLog(@"this date is:%@ , and date we check to equality is:%@",thisDate,dateToFind);
if([thisDate isEqualToDate:dateToFind]  )
{
    NSLog(@"equal date!"); // not printed! 
}

NSLog告诉我这个:

this date is:2012-09-13 14:23:54 +0000 , and date we check to equality is:2012-09-13 14:23:54 +0000

他没有打印NSLog。 为什么?

2 个答案:

答案 0 :(得分:1)

正如一些人所说的那样,似乎是一秒钟的一小部分给你带来了麻烦。原因是NSDate只是NSTimeIntervaldouble)周围的对象包装器,其参考日期(2001年1月1日格林尼治标准时间1月1日)的秒数值。

有几种主要方法可以解决这个问题。检查日期以查看它是否在给定范围内,或者(更可能基于您的问题)完全关闭一秒的分数。

NSDate截断秒数是微不足道的代码。您可能希望截断存储时存储的所有日期,以便进行快速比较。您可以截断现有NSDate,如下所示:

NSDate *truncatedDate = [NSDate dateWithTimeIntervalSinceReferenceDate:((NSTimeInterval)lround(originalDateObject.timeIntervalSinceReferenceDate))];

这段代码非常自我解释。它抓取日期的支持时间间隔将其舍入为一个整数强制转换回一个时间间隔并创建一个新的截断日期。

对两个日期执行此操作后,您可以比较两个截断日期,它们将按预期运行。

或者,如果您必须在不更改日期数据的情况下执行某些操作,则可以执行以下操作:

if (lround(thisDate.timeIntervalSinceReferenceDate) == lround(dateToFind.timeIntervalSinceReferenceDate)){
    // If whole seconds are equal, as shown in log, this will execute.
}

答案 1 :(得分:0)

NSLog(@"this date is:%@ , and date we check to equality is:%@",
      thisDate,dateToFind);

尝试使用以下内容更改上述内容:

NSLog(@"this date is:%f , and date we check to equality is:%f",
      [thisDate timeIntervalSince1970],
      [dateToFind timeIntervalSince1970]);