NSDate比较结果与NSDateComponents转换后没有NSOrderedSame
问题描述:
为了将日期值传递给C++库,我需要从NSDate
中提取年,月,日等。我使用NSDateComponents
,并将再次从C++库重建NSDate
和NSDateComponents
。但我注意到,即使NSDate
我的日志看起来完全一样,往返比较总是失败。这里是一个简单的单元测试:NSDate比较结果与NSDateComponents转换后没有NSOrderedSame
- (void) testCalender {
NSDate *timestamp = [NSDate date];
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:timestamp];
NSLog(@"%@", components);
//Calendar Year: 2016
//Month: 2
//Leap month: no
//Day: 26
//Hour: 10
//Minute: 48
//Second: 36
NSDate *result = [[NSCalendar currentCalendar] dateFromComponents:components];
NSLog(@"%@", timestamp); // 2016-02-26 15:48:36 +0000
NSLog(@"%@", result); // 2016-02-26 15:48:36 +0000
XCTAssertEqual([timestamp compare:result], NSOrderedSame); // Failed
}
我错过了什么?
答
发生这种情况是因为NSDate
在内部使用的是亚秒级精度。当您查询[NSDate date]
时,您会得到一个可能具有非零纳秒部分的日期。但是当你重新创造它的时候,你会错过那个部分,而且他们的差异很小。所以你还需要处理NSCalendarUnitNanosecond
。
答
NSDate
是纳秒精度。只要你重新组装那些NSDateComponents
,未设定的将是0
,产生稍微不同的日期。