2014-09-20 73 views
1

我相信這個問題出現之前,我拉我的頭髮。我有兩個日期 - 一個來自Parse.com上的對象,另一個來自本地。我嘗試確定遠程對象是否已更新,以便我可以在本地觸發操作。比較兩個日期在objective-c

當查看兩個對象的NSDate時,它們看起來完全相同,但是比較顯示遠程對象較新 - 檢查內部時間(自1970年以來)很明顯,有差別,但爲什麼?當我第一次創建本地對象我所做的就是

localObject.updatedAt = remoteObject.updatedAt //both NSDate 

但看的時候更接近我得到這個:

Local Time Interval: 1411175940.000000 
Local Time: 2014-09-20 01:19:00 +0000 
Remote Time Interval: 1411175940.168000 
Remote Time: 2014-09-20 01:19:00 +0000 

有沒有人有一個想法,這是爲什麼,我是否可以忽略這個細節? iOS收集什麼?

添加更多的代碼:

@property (strong, nonatomic) NSDate *date;  
...  
PFQuery *query = [PFObject query]; 
[query whereKey:@"Product" equalTo:@"123456"] 
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (!error) 
    { 
     self.date = objects[0].updatedAt; 
     NSTimeInterval localTime = [self.date timeIntervalSince1970]; 
     NSTimeInterval remoteTime = [objects[0].updatedAt timeIntervalSince1970]; 
     NSLog(@"Local Time Interval: %f", localTime); 
     NSLog(@"Local Time: %@", self.date); 
     NSLog(@"Remote Time Interval: %f", remoteTime); 
     NSLog(@"Remote Time: %@", objects[0].updatedAt); 
    } 
    else 
    { 
     NSLog(@"Error with query"); 
    } 
}]; 

導致控制檯輸出上面 - 我不明白爲什麼這些日期是不同的。

+3

我們需要看到比這更多的代碼。 – Lance 2014-09-20 04:26:25

+0

1.如何比較日期? 2.使用'-timeIntervalSinceReferenceDate'。結果是什麼? – 2014-09-20 06:01:46

回答

1

解析保存日期,ISO8601格式。這使得事情變得非常複雜,因爲蘋果沒有很好地管理格式。雖然標準的想法是真棒,直到每個人都遵守同樣的規則,規則混亂..起着

我轉換了從解析入站成可用的格式試圖對他們的日期時間值任何東西之前..

降本到某個地方的圖書館,並節省您的頭痛。這需要數週的搜索和抓取才能克服。

+ (NSDate *)convertParseDate:(NSDate *)sourceDate { 
    NSDateFormatter *dateFormatter = [NSDateFormatter new]; 
    NSString *input = (NSString *)sourceDate; 
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; 
    // Always use this locale when parsing fixed format date strings 
    NSLocale* posix = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
    dateFormatter.locale = posix; 
    NSDate *convertedDate = [dateFormatter dateFromString:input]; 

    assert(convertedDate != nil); 
    return convertedDate; 
} 
+0

真棒,非常感謝! – user3757285 2014-09-21 03:09:28

+0

順便說一句 - 對我來說有太多的刮傷,我現在很大膽 – user3757285 2014-09-21 03:11:27

+0

爲什麼從'NSDate'轉換到'NSString'? – trojanfoe 2014-09-21 15:36:23

3

我無法解釋爲什麼是有差別的,但瞭解的重要的事情是可以有區別和比較日期時,你必須使用一個公差值

蘋果Date and Time Programming Guide對如何在給定公差範圍內的兩個日期比較的例子:

要比較日期,您可以使用isEqualToDate:compare:laterDate:earlierDate:方法。這些方法執行精確的 比較,這意味着他們檢測到 日期之間的亞秒差異。您可能希望將日期與不太精細的粒度進行比較。例如,對於 示例,如果兩個日期在彼此的 分鐘內,則可能需要考慮兩個日期相等。如果是這種情況,請使用timeIntervalSinceDate: 來比較兩個日期。以下代碼片段顯示如何使用 timeIntervalSinceDate:來查看兩個日期是否在一分鐘內(60個 秒)。

if (fabs([date2 timeIntervalSinceDate:date1]) < 60) ... 

它是由你決定公差值,但一些如0.5秒鐘都覺得合理:

+ (BOOL)date:(NSDate *)date1 
    equalsDate:(NSDate *)date2 
{ 
    return fabs([date2 timeIntervalSinceDate:date1]) < 0.5; 
} 
+0

但是在閱讀完文檔之後,知道它們是一個很大的老,並且不包含一些不錯的新API。請務必在日曆計算中觀看WWDC 2013視頻,並查看關鍵類的標題,尤其是NSCalendar。 – uchuugaka 2014-09-20 12:00:59

+0

好,謝謝你們 - 非常感謝。仍然是一個謎,但至少現在我知道如何繞過...再次感謝 – user3757285 2014-09-20 18:25:38