2011-06-16 56 views
3

我有一個應用程序在預定時間播放警報聲。 這是設置爲每天同時關閉的重複警報。例如:每天早上6點起牀。NSDate在飛機模式或DST轉換後滑倒或轉彎一小時

我首先注意到DST轉換後的一個問題。我會在12月份創建一個鬧鐘,例如每天早上6點關閉。行軍結束後,警報開始提前1小時(或者可能遲到,不記得)。但是當我試圖調試這個問題時,它永遠不會發生,當我坐下來真正深入研究它時,我無法重現這個問題。

最近,當我上牀睡覺的時候,我一直把我的手機置於飛機模式。這似乎更頻繁地重現問題。但有些時候, 一切正常。但是如果我在進入飛機模式後檢查報警時間,它們會比我創建的時間晚一個小時。 NSDate將在上午7點而不是早上6點在我的報警表中顯示 。但有時它顯示爲早上6點。所以我打開了報警器。但第二天早上7點鬧鐘響起。

我認爲它與DST和手機不知道它是否在DST中爲 NSDate對象。但是,我手機上顯示的實際時間從未出錯。但是我的警報在錯誤的時間出現。

這裏是我的代碼示例: 注: timerRec是從我的數據庫 alarmTime是的NSDate對象從數據庫中 拉到一個結構化記錄的NSLog的價值是有調試,看看我是否能得到它打印出錯 但是,當我連接到調試器時,它永遠不會失敗。

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
NSString *tempAlarm = [dateFormatter stringFromDate:timerRec.alarmTime]; 
NSLog(@"scheduleAlarm for firedate: %@", tempAlarm); 

[CCUtility scheduleAlarmForDate: timerRec.alarmTime alarmSound: 
    [CCUtility convertSoundCodeToFileName: [timerRec.soundCode intValue]] 
alarmMessage: message repeatInterval: repeatInterval]; 

任何幫助,將不勝感激。我可以發佈額外的代碼,但主要的問題似乎有點奇怪,我如何使用NSDate以及系統時鐘如何在飛行模式下在幕後工作。

感謝,

凱文

回答

1

你可能使用存儲您的日期時不取時區考慮的格式。

爲什麼你不直接使用NSDateFormatter NSLog你的timerRec NSDate? 此外,直接記錄NSDate將在控制檯中顯示有關NSDate的時區+ DST信息,而您使用的NSDateFromatterMediumStyle則不會(使用此日期樣式顯然不是用於調試此類問題的最佳樣式,這些問題會引發TZ & DST!)