3

我有一个应用程序在预定时间播放警报声。这被设置为每天同时响起的重复警报。例如:每天早上 6 点起床。

在夏令时过渡后,我首先注意到了一个问题。我会有一个我在 12 月创建的闹钟(例如),每天早上 6 点响起。三月后,警报开始提前 1 小时响起(或者可能更晚,不记得了)。但是当我试图调试这个问题时,它永远不会发生,当我坐下来真正深入研究它时,我无法重现这个问题。

最近,当我上床睡觉时,我一直将手机置于飞行模式。这似乎更频繁地重现该问题。但有时一切正常。但是,如果我在进入飞行模式后检查闹钟时间,它们会比我创建的时间晚一个小时。NSDate 将在早上 7 点而不是早上 6 点出现在我的闹钟表中。但有时它显示为早上 6 点。于是我打开了闹钟。但是第二天早上7点闹钟响了。

我认为这与 DST 和手机有关,它不知道 NSDate 对象是否在 DST 中。但是,我手机上显示的实际时间从来没有错。但是我的闹钟在错误的时间响起。

这是我的代码示例: 注意: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 以及系统时钟如何在飞行模式下在幕后工作。

谢谢,

凯文

4

1 回答 1

1

您可能使用的格式在存储日期时不考虑时区。

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

于 2011-06-17T20:45:54.610 回答