使用NSDateComponents转换后,NSDate比较结果不是NSOrderedSame

时间:2016-02-26 15:59:00

标签: ios objective-c

为了将日期值传递给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
}

我错过了什么?

2 个答案:

答案 0 :(得分:1)

这是因为NSDate在内部使用亚秒精度。当您查询[NSDate date]时,您会得到一个可能具有非零纳秒部分的日期。但是当你重新创建它时,你会错过那个部分而且它们之间的区别很小。所以你还需要处理NSCalendarUnitNanosecond

答案 1 :(得分:1)

load精确到纳秒级。只要您重新组合NSDate,那些未设置的NSDateComponents就会0,会产生稍微不同的日期。