2011-04-28 21 views
3

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

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

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

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

回答

13

当您所描述的原始日期对象你失去从原始对象的一些子第二精度 - 换句话说,-description剃须断分数秒,并返回

接收机的字符串表示在国际格式YYYY-MM-DD HH:MM:SS ±HHMM,其中±HHMM代表时区当你创建一个新的Date对象BAS小时和分钟从GMT

偏移编辑说明,你可以在整秒内得到它,因为字符串只能精确到整秒。因此,-isEqualToDate:返回NO,因为您的两个日期对象之间存在一小部分秒的差异,这对它很敏感。

此方法检测日期之间的亚秒差异。如果您想比较不太精细的日期,请使用timeIntervalSinceDate:来比较两个日期。

所以,你会做这样的事情,而不是(NSTimeInterval措施以秒计):

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

'-timeIntervalSinceDate:'当我的两个日期间隔显然为0.0005秒时,返回非零值。我最终比较了每个日期的[NSString stringWithFormat:@“%。3f”,d]'。 – Dov 2012-01-27 14:04:07

+0

NSDate.timeIntervalSinceDate返回一个NSTimeInterval,它是一个Double值,可能小于一秒。我这种情况下,我建议像这样检查'[d timeIntervalSinceDate:dd] <1'如果1使我们变得含糊不清,例如, 0.1 – Stephan 2015-07-23 18:50:48

2

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

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:不维持亚秒精度。