我正在使用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!");
}
答案 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:
方法不保持亚秒精度。