2应该相等的NSDates不是?

时间:2011-04-28 18:46:24

标签: objective-c cocoa nsdate equality

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

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

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

NSLog(@"%@", d);
NSLog(@"%@", dd);
if( [d isEqualToDate:dd] ){
    NSLog(@"Yay!");
}

3 个答案:

答案 0 :(得分:13)

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

  

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

当你根据描述创建一个新的日期对象时,你可以在几秒钟内得到它,因为字符串只精确到整秒。所以-isEqualToDate:会返回NO,因为两个日期对象之间只有一秒的差异,这对它很敏感。

  

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

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

if ([d timeIntervalSinceDate:dd] == 0) {
    NSLog(@"Yay!");
}

答案 1 :(得分:2)

isEqualToDate检测日期之间的亚秒差异,但描述方法不包括subseconds。

答案 2 :(得分:2)

因为它们不相同:

NSDate *d = [NSDate date];
NSDate *dd = [NSDate dateWithString:[d description]];
NSLog(@"%f", [d timeIntervalSinceReferenceDate]);
NSLog(@"%f", [dd timeIntervalSinceReferenceDate]);

产地:

2011-04-28 11:58:11.873 EmptyFoundation[508:903] 325709891.867788
2011-04-28 11:58:11.874 EmptyFoundation[508:903] 325709891.000000

换句话说,+dateWithString:方法不保持亚秒精度。