为了将日期值传递给C ++库,我需要从NSDate
中提取年,月,日等。我使用NSDateComponents
,并将从C ++库中再次使用NSDate
重建NSDateComponents
。但我注意到,即使NSDate
I日志看起来完全相同,往返比较总是失败。这是一个简单的单元测试:
- (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
}
我错过了什么?
答案 0 :(得分:1)
这是因为NSDate
在内部使用亚秒精度。当您查询[NSDate date]
时,您会得到一个可能具有非零纳秒部分的日期。但是当你重新创建它时,你会错过那个部分而且它们之间的区别很小。所以你还需要处理NSCalendarUnitNanosecond
。
答案 1 :(得分:1)
load
精确到纳秒级。只要您重新组合NSDate
,那些未设置的NSDateComponents
就会0
,会产生稍微不同的日期。