2009-11-06 16 views
0

我已經在應用程序中創建了一個應用程序,我開始倒數計時器並將當前日期保存爲數據庫中的雙值,並且還根據倒數計時器保存結束日期。關閉並返回到應用程序後,我獲取時間表數據庫找到當前日期和開始日期,並根據此設置倒計時。但是,如果我將時間提前8小時更改,則倒計時計時器的行爲會有所不同,我會如何發現用戶更改了時間或時區?如果我改變時區假設新德里美國它工作正常,但在同一時區,如果我增加/減少日期或時間它不表現如預期,我該如何管理?如何找到該用戶改變了iPhone SDK的時間?

此外,我看到了一個奇怪的問題,當增加/減少日期或時間的應用程序,只要它launched.i我無法弄清楚

回答

3

爲了您的計時器是準確的關閉,你應該只使用結束日期。我不確定你爲什麼要保留開始日期。

下面是用連續倒計時的例子:

// I'm assuming you want to update the countdown every seconds 
// So you should set a timer like this somewhere 
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick) userInfo:nil repeats:YES]; 

- (void)updateCountdown { 
    NSTimeInterval timeInterval = [endDate timeIntervalSinceNow]; 

    unsigned int d, h, m, s; 
    NSTimeInterval r; 

    d = timeInterval/(24 * 3600); 
    r = timeInterval - d * 24 * 3600; 

    h = r/3600; 
    r = r - h * 3600; 

    m = r/60; 
    r = r - m * 60; 

    s = r; 

    NSString *countdown = [NSString stringWithFormat:@"%.2d:%.2d:%.2d:%.2d", d, h, m, s]; 
    // Now you could use countdown to update the text of a UILabel 
} 

- (void)timerTick { 
    if ([endDate compare:[NSDate date]] == NSOrderedDescending) { 
     //endDate is later in time than "now", ie not yet reached 
     [self updateCountdown]; 
    } else { 
     //stop the countdown 
     [timer invalidate]; 
    } 
} 

endDate應該是包含日期的NSDate當倒計時應達到0.1

因爲倒計時調整一次秒鐘,你不會即使系統時間或時區發生更改也會出現問題。

但是請確保您在應用程序重新啓動/關閉時正確保存並恢復endDate(即始終使用固定參考!我將使用NSDate類中的timeIntervalSinceReferenceDate和dateWithTimeIntervalSinceReferenceDate)。

0

如果你曾經在endDate使用像這樣在具有計時器射擊只是感興趣:

NSTimer* timer = [[NSTimer alloc] initWithFireDate:endDate 
              interval:0.0f 
              target:self 
              selector:@selector(endDateReached:) 
              userInfo:nil 
              repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
[timer release]; 
0

我不知道如何可以得到周圍的用戶不斷變化的時間,而你的應用程序ISN」運行。但我認爲你不需要存儲startDate或定時器的持續時間。你可以做的是將endDate存儲在數據庫中。我會嘗試以時區無關的方式將其存儲,例如GMT。

然後,下一次啓動應用程序時,請將存儲在數據庫中的日期轉換回當地時間。當您的應用程序啓動時,也從NSDate類獲取當前時間。然後可以從轉換後的endDate中減去當前時間來計算計時器持續時間。

這應該允許用戶更改他們的時區,並且仍然在正確的時間觸發事件。您的數據庫中也不會存儲更少的數據。

+0

我正在做你想說的話。我在db中存儲結束日期,並在重新啓動時獲取本地時間。但是當從nsdate類獲取當前時間時,如果我將時間改回2小時,當前nsdate將返回錯誤那麼結束日期和當前日期之間的差異並不如預期的那樣。問題是如何克服這個問題 – 2009-11-07 06:34:42

相關問題