当处于飞行模式或夏令时转换后,NSDate会向前或向后滑动一小时。

3
我有一个应用程序,可以在预定时间播放闹钟声音。这是一个重复的闹钟,每天都会在同一时间响起。例如:每天早上6点起床。
我首先注意到一个问题是在夏令时转换后。我创建了一个在12月份设置每天早上6点钟响铃的闹钟。到了3月份,闹钟开始在1小时之前响铃(或可能晚些,记不清了)。但当我试图调试问题时,它从未发生过,而且当我坐下来真正深入挖掘它时,我无法再次重现该问题。
最近,当我睡觉时,我已经将手机设置为飞行模式。这似乎更频繁地重现了这个问题。但有时候一切都运行良好。但是,如果我在进入飞行模式后检查闹钟时间,它们将显示比我创建的晚一个小时。NSDate将在我的闹钟表中显示为上午7点,而不是上午6点。但有时它会显示为上午6点。所以我打开闹钟。但第二天早上,闹钟在上午7点响起。
我认为这与夏令时有关,因为手机不知道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以及在飞行模式下系统时钟背后的工作方式有关。
谢谢, Kevin
1个回答

1

你可能使用的格式在存储日期时没有考虑时区。

为什么不直接使用NSLog记录你的timerRec NSDate,而不是使用NSDateFormatter? 此外,直接记录NSDate将在控制台中显示有关NSDate的时区+ DST信息,而你使用的NSDateFromatterMediumStyle则不会(显然,使用此日期样式来调试与TZ和DST相关的问题并不是最好的样式!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接