2013-10-13 60 views
1

在代碼是在我的iOS應用程序反覆運行,我有:爲什麼時間在這裏凍結?自1970年以來,每次都可以獲得秒數嗎?

// int timeStampMilliseconds = (ceil([[NSDate date] timeIntervalSince1970] * 1000.0)); 
// double timeStampMilliseconds = [[NSDate date] timeIntervalSince1970] * 1000.0; 
// double timeStampMilliseconds = CACurrentMediaTime() * 1000; 
double timeStampMilliseconds = CFAbsoluteTimeGetCurrent() * 1000.0; 
double hours = fmodf(timeStampMilliseconds, 86400000)/3600000.0; 
double minutes = fmodf(timeStampMilliseconds, 3600000)/60000.0; 
double seconds = fmodf(timeStampMilliseconds, 60000)/1000.0; 
NSLog(@"Milliseconds: %lf, Hours: %lf, minutes: %lf, seconds: %lf", timeStampMilliseconds, hours, minutes, seconds); 

的三種方法,我知道的獲得時間[NSDate date] timeIntervalSince1970CACurrentMediaTime()CFAbsoluteTimeGetCurrent()

當我運行它們,timeIntervalSince1970和CFAbsoluteTimeGetCurrent獲得的UTC時間在幾秒鐘內...但奇怪的是,當達到日誌語句時,milleseconds以適當的速度上升,但小時,分鐘和秒在它們啓動時被凍結。鍾針不動。

CACurrentMediaTime顯示更多人所期望的;它準確地說明了自某個時間標記以來已經過去了多少時間,這意味着秒,分鐘和小時都在增加。

我想我可以做一個解決方法行爲,讓初始化程序初始化一個常量到TimeIntervalSince1970減去CACurrentMediaTime,然後在引用的代碼中添加保存的常量和CACurrentMediaTime。但是我想知道發生了什麼,以及爲什麼在三種計時方法中的兩種計時方法中,以毫秒爲單位的原始數量反映了小時,分鐘和秒鐘的更新,但小時,分鐘和秒鐘被凍結。

感謝,

回答

3

對於雙用途fmod()沒有fmodf()
格式可能是:%0.f而不是%lf

毫秒顯示正確的事實表明問題必須出現在其他單位的數學中,而不是時間方法。

簡單的代碼:

double timeStampSeconds = [[NSDate date] timeIntervalSince1970]; 
double hours = fmod(timeStampSeconds/86400, 24); 
double minutes = fmod(timeStampSeconds/3600, 60); 
double seconds = fmod(timeStampSeconds,  60); 
NSLog(@"Milliseconds: %lf, Hours: %.0f, minutes: %.0f, seconds: %.0f", timeStampSeconds * 1000.0, hours, minutes, seconds); 

所有的人都能使用Cocoa方法如NSDateComponentsNSDateFormatter

+0

比我問的要好。謝謝! – JonathanHayward

相關問題