2013-04-09 83 views
0

我有兩個字符串來自我的服務器,其中存儲了時間,我需要比較兩者之間的時間間隔(以分鐘爲單位),如果需要,則以小時。我應該轉換爲NSDate還是使用NSString獲取目標C中兩個NSString之間的差異時間

NSString看看這樣的:

NOW 14:22 
LAST TIME 10:18 

編輯#1 因爲每個人都在說我使用NSDate的,我轉換的數據在我的數據庫,以DATETIME,現在我可以使用兩個NSDate的比較下面的代碼:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"pt_BR"]]; 
    [dateFormatter setDateFormat: @"yyyy-MM-dd HH:mm:ss"]; 

    NSDate *currentDateTimeWithOffset = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone localTimeZone] secondsFromGMT]]; 

    NSString *strDate = [dateFormatter stringFromDate:currentDateTimeWithOffset]; 
    NSDate * now = [dateFormatter dateFromString:strDate]; 
NSDate *date = [dateFormatter dateFromString:@"2013-04-09 12:10:18"]; 

NSLog(@"Difference %f",[now timeIntervalSinceDate:date]); 

而結果是:

Difference 864.000000 
NOW 2013-04-09 15:24:42 +0000 
LAST DATE 2013-04-09 12:10:18 

這是正確的嗎?差異在幾秒鐘內?

+0

您有大約5個不同的選項。最簡單的是自己破解格式。或者你可以使用NSDateFormatter,有或沒有NSCalendar。如果你等待足夠長的時間,有人可能會提出一個正則表達式版本。如果您使用NSDateFormatter/NSCalendar,請注意時區陷阱。 – 2013-04-09 17:35:09

回答

4

如果格式比您顯示的格式複雜,請考慮使用NSDateFormatter。舉個簡單的例子:

NSArray *hoursMins = [timeString componentsSeparatedByString:@":"]; 
NSInteger timeInMins = [hoursMins[0] intValue] * 60 + [hoursMins[1] intValue]; 

然後用分鐘減去兩次。日期格式的方法是這樣的:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"HH:mm"]; 
NSDate *date = [df dateFromString:timeString]; 

您可以在幾秒鐘內得到使用兩個日期之間的差異:

[date timerIntervalSinceDate:anotherDate]; 
+0

hourMins數組中的值不會是字符串嗎?你正在計算中的數值。 – 2013-04-09 17:37:05

+0

oops。忘了int值。謝謝。 – danh 2013-04-09 17:38:31

+0

+1爲NSDateFormatter示例,這是我將使用的方法。 – 2013-04-09 17:44:23

0

NSDateFormatter是「乾淨」的方式做到這一點。但是,如果你正在尋找快速和骯髒的,這些是你得到的實際的字符串(包括現在和最後時間),我只是使用特定的NSRange來拉出小時和分鐘,並比較它們。

確保雖然您檢查了小時,但如果「現在」小時在「最後一次」小時之前,那麼您現在將24添加到現在以拋出白天翻轉。

-1

由於只有NSStringNSDateFormatter用於獲取NSDate

NSDateFormatter *rfc3339DateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

[rfc3339DateFormatter setLocale:enUSPOSIXLocale]; 
[rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 
[rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

// Convert the RFC 3339 date time string to an NSDate. 
NSDate *date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString]; 

如果你有好幾個小時,分鐘和秒的單獨值,你可以使用NSCalendar

NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setYear:1965]; 
[comps setMonth:1]; 
[comps setDay:6]; 
[comps setHour:14]; 
[comps setMinute:10]; 
[comps setSecond:0]; 
NSDate *date = [gregorian dateFromComponents:comps]; 
[comps release]; 

和完美的解決方案是使用時間戳而不是NSString。不僅可以很容易地將時間戳轉換爲NSDateNSDate +dateWithTimeIntervalSinceReferenceDate),然後在需要時轉換爲NSString,但您也可以通過減法獲得時間差。

並與兩個NSDate對象的時間差異計算與NSDate -timeIntervalSinceDate

+0

這個答案沒有解決問題中的實際問題。 – rmaddy 2013-04-09 18:00:03

+0

@rmaddy這不是複製和粘貼解決方案,我不打算給這個級別的問題無論如何。是的,無論是編輯前後的問題。 – 2013-04-09 19:20:36