2016-02-26 29 views
0

为了将日期值传递给C++库,我需要从NSDate中提取年,月,日等。我使用NSDateComponents,并将再次从C++库重建NSDateNSDateComponents。但我注意到,即使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 
} 

我错过了什么?

回答

1

发生这种情况是因为NSDate在内部使用的是亚秒级精度。当您查询[NSDate date]时,您会得到一个可能具有非零纳秒部分的日期。但是当你重新创造它的时候,你会错过那个部分,而且他们的差异很小。所以你还需要处理NSCalendarUnitNanosecond

1

NSDate是纳秒精度。只要你重新组装那些NSDateComponents,未设定的将是0,产生稍微不同的日期。