2016-02-26 33 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,產生稍微不同的日期。