Ios 两个具有相同日期值和相同哈希的NSDATE怎么可能不相等?

Ios 两个具有相同日期值和相同哈希的NSDATE怎么可能不相等?,ios,comparison,nsdate,Ios,Comparison,Nsdate,我在NSDictionary中的一个NSDate键下存储了一个对象。然后我得到另一个具有相同日期值的NSDate,并使用它从NSDictionary检索对象。令我惊讶的是,它返回了nil。但在我的调试过程中透露的信息更让我震惊: (lldb)采购订单(当 (NSDate*)$34=0x0f8be100 2012-05-11 21:08:37+0000 (lldb)po[newTaskDict objectForKey:when] (id)$36=0x00000000 (lldb)po[newTa

我在
NSDictionary
中的一个
NSDate
键下存储了一个对象。然后我得到另一个具有相同日期值的
NSDate
,并使用它从
NSDictionary
检索对象。令我惊讶的是,它返回了
nil
。但在我的调试过程中透露的信息更让我震惊:

(lldb)采购订单(当
(NSDate*)$34=0x0f8be100 2012-05-11 21:08:37+0000
(lldb)po[newTaskDict objectForKey:when]
(id)$36=0x00000000
(lldb)po[newTaskDict allkey]
(id)$37=0x0f8c1650(
2012-05-11 21:08:37+0000
)
(lldb)po[[newTaskDict allKeys]lastObject]
(id)$38=0x0F8B5FF012-05-1111:08:37+0000
(lldb)p(int)[[newTaskDict allKeys]lastObject]isEqual:when]
(国际)39美元=0
(lldb)po[[[newTaskDict allKeys]lastObject]类]
(id)$40=0x3F449600\uuu NSDate
(lldb)po[上课时]
(id)$41=0x3F449600\uuu NSDate
(lldb)p(int)[[newTaskDict allKeys]lastObject]isEqualToDate:何时]
(国际)42美元=0
(lldb)p(int)[[newTaskDict allKeys]lastObject]散列]
(国际)43美元=358463317
(lldb)p(int)[散列时]
(内部)$44=358463317

如您所见,
newTaskDict
只有一个条目由原始的
NSDate
键入,其值为($38):
0x0f8b5ff0 2012-05-11 21:08:37+0000

谁的哈希是($43):
35846331

用于检索条目的另一个
NSDate
是($34):
0x0f8be100 2012-05-11 21:08:37+0000

它的哈希值是($44):
358463317

除了内存地址之外,这两个
NSDate
不是完全相同吗?
isEqual:
($39)和
isEqualToDate:
($42)如何为他们返回NO

已解决:

这种奇怪的不寻常原来是由
亚秒级的差异造成的。你必须阅读我在被接受的答案下的第二条评论,因为它真的很有趣,如果你不知道的话,有一天它可能会咬你。

到目前为止,我的质量相当于几微秒。如果您需要更低的精度,请使用timeIntervalSinceDate:测试彼此之间的日期是否在微秒、秒、小时、天等范围内


isEqual经常使用内存地址本身来确定它是否是同一个对象,因为如果它们有不同的地址,它们是不同的对象。

isEqual到目前为止的比较时间为微秒。如果您需要更低的精度,请使用timeIntervalSinceDate:测试彼此之间的日期是否在微秒、秒、小时、天等范围内


isEqual经常使用内存地址本身来决定它是否是同一个对象,因为如果它们有不同的地址,它们是不同的对象。

isEqualToDate:
还将查看毫秒,这是通过记录对象无法看到的,因为
NSDate
的描述方法仅格式化一个人性化的字符串,但是,日期对象后面有更多信息

您的两个日期似乎略有不同,即使它们是在同一运行循环中创建的,也可能发生这种情况,尝试创建一个并在两个引用中仅使用一个对象,然后进行第二次测试以检查分别创建的两个
NSDate
对象-即使一个接一个,它们也不应该相等

引用Apple文档:

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


isEqualToDate:
还将查看毫秒,您无法通过记录对象来查看毫秒,因为
NSDate
的描述方法仅格式化人性化字符串,但是日期对象后面有更多信息

您的两个日期似乎略有不同,即使它们是在同一运行循环中创建的,也可能发生这种情况,尝试创建一个并在两个引用中仅使用一个对象,然后进行第二次测试以检查分别创建的两个
NSDate
对象-即使一个接一个,它们也不应该相等

引用Apple文档:

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


1)它是一个特定的时间值,而不是从
[NSDate date]
获取的“现在时间”。2) 正如您所见,我使用的是
NSDate
作为dict键,因此只有
isEqual:
对我来说才有意义。我不能“使用TimeIntervalenceDate:来比较这两个日期”。3) 遗憾的是,我已经丢失了特定的
NSDate
,现在我不能重复这种奇怪的不平等现象。正如文档所说,它还考虑了“日期之间的亚秒差异”,这包括但不限于毫秒。实验后,我可以说,一定是亚秒级的差异造成了这种奇怪的不平等。尽管这两个
NSDate
预期具有相同的特定时间值,但后一个时间值将从服务器返回。我猜当服务器存储
NSDate
时,在
亚秒的
时间内会有一些精度损失。整个事情似乎更奇怪,因为两个
NSDate
返回相同的哈希值,即使它们携带不同的亚秒值。1)这是一个特定的时间值,而不是从
[NSDate date]
获取的“现在时间”。2) 正如您所见,我使用的是
NSDate
作为dict键,因此只有
isEqual:
对我来说才有意义。我不能“使用TimeIntervalenceDate:来比较这两个日期”。3) 遗憾的是,我已经丢失了特定的
NSDate
,现在我不能重复这种奇怪的不平等。正如文档所说,它还考虑到了“日期之间的亚秒差异”,这将包括但