1

我比较了 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 。为什么 ?

4

2 回答 2

1

正如一些人所说,似乎是几分之一秒给你带来了麻烦。这样做的原因是 anNSDate只是一个围绕NSTimeInterval( double) 的对象包装器,其值自参考日期(格林威治标准时间 2001 年 1 月 1 日上午 12 点)以秒为单位。

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

从 an 中截断秒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.
}
于 2012-09-13T15:36:36.963 回答
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]);
于 2012-09-13T14:57:58.310 回答