2010-10-28 74 views
11

我有一個應用程序,它是一個基本的計時器。它會跟蹤應用運行的秒數。我想將其轉換爲秒(NSUInteger),如下所示:00:00:12(hh:mm:ss)。所以,我看到這篇文章:格式化成hh的秒:ii:ss

NSNumber of seconds to Hours, minutes, seconds

從中我寫了這個代碼:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"hh:mm:ss"]; 

它工作正常,但它04:00:00開始了。我不知道爲什麼。我也試着做這樣的事情:

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[self meeting] elapsedSeconds] * -1]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"hh:mm:ss"]; 

以爲這樣就可以正確地顯示該計數器,但它確實一個奇怪的1點23分00秒,然後只需翻轉至04:00:00,並在那裏停留的休息時間。

MS

+0

我認爲[這](http://stackoverflow.com/questions/4042958/how-to-find-the-difference-between-two-dates- in-hhmmss-format-in-objective-c/4043251#4043251)就是你要找的。您將執行第3步,並且該代碼中的「ti」是您的'elapsedSeconds'。如果有幫助的話,一定要給這個問題的回答者(不是我)一個贊成。 – Anna 2010-10-28 21:23:55

+0

感謝ABO。雖然我認爲通過使用NSDateFormatter,我不會需要計算所有的片斷......對此有什麼想法? – 2010-10-28 21:30:54

+0

NSDateFormatter用於格式化日期/時間(如下午3點),而不是持續時間或經過的秒數。 – Anna 2010-10-28 21:34:05

回答

49

這類似於previous answer有關格式化時間,但因爲我們沒有與日期處理任何更不需要日期格式。

如果您有存儲爲整數的秒數,你可以制定出個人計時組件自己:

NSUInteger h = elapsedSeconds/3600; 
NSUInteger m = (elapsedSeconds/60) % 60; 
NSUInteger s = elapsedSeconds % 60; 

NSString *formattedTime = [NSString stringWithFormat:@"%u:%02u:%02u", h, m, s]; 
+1

優秀,爲什麼要處理timeozone無意義! – Andy 2014-07-05 19:44:11

+0

是的,簡單的大聲笑 – Alan10977 2015-05-26 03:30:12

+0

@downvoter - 請解釋downvote的原因,以便我可以修復它(或者甚至自己修復答案) – dreamlax 2016-06-11 13:35:50

7

雖然有這樣做的更簡單的方法(@dreamlax有一個很好的方法)讓我解釋一下什麼是錯的例子,讓我們得到它的工作:

首先,它顯示04:00:00的原因(當然,它可能實際上顯示04:00:12),是因爲它是從UTC/GMT轉換時間到你當地的時間。爲了解決這個問題,你需要添加下面一行:

[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

然後,將不再顯示04:00:12,因爲它不轉換時區。不幸的是,它現在將顯示12:00:12而不是00:00:12,因爲它是午夜。爲了解決這個問題,已經將其轉換字符串到24小時的時間通過作爲替代使用HH格式,而不是hh

[formatter setDateFormat:@"HH:mm:ss"]; 

請記住,因爲這是設計的與時俱進,這是行不通的超過24小時(因爲它會再次翻轉到午夜)。

完整的代碼是:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"HH:mm:ss"]; 
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSLog(@"%@", [formatter stringFromDate:date]); 
// Results: 00:00:12