2应该相等的NSDates不是?

cfi*_*her 3 cocoa equality objective-c nsdate

我正在使用Stig Brautaset的JSON库(http://code.google.com/p/json-framework),我需要序列化一个NSDate.我正在考虑在JSONifying之前将其转换为字符串,但是,我遇到了这种奇怪的行为:

为什么这些NSDates不被认为是平等的?

NSDate *d = [[NSDate alloc] init];
NSDate *dd = [NSDate dateWithString:[d description]];

NSLog(@"%@", d);
NSLog(@"%@", dd);
if( [d isEqualToDate:dd] ){
    NSLog(@"Yay!");
}
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 13

当您描述原始日期对象时,您将失去原始对象的某些亚秒级精度 - 换句话说,-description刮掉小数秒,然后返回

国际格式的接收器的字符串表示YYYY-MM-DD HH:MM:SS ±HHMM,其中±HHMM表示从GMT开始的小时和分钟的时区偏移

当您根据描述创建新的日期对象时,您可以在整秒内获得它,因为该字符串仅精确到一秒.因此,-isEqualToDate:返回NO是因为两个日期对象之间存在一小段时间的差异,这对它很敏感.

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

所以你会做这样的事情(NSTimeInterval以秒为单位):

if ([d timeIntervalSinceDate:dd] == 0) {
    NSLog(@"Yay!");
}
Run Code Online (Sandbox Code Playgroud)