NSDate сдвигается назад или вперед на час в режиме полета или после перехода на летнее время - PullRequest
3 голосов
/ 16 июня 2011

У меня есть приложение, которое воспроизводит звук будильника в назначенное время. Это настроено как повторяющаяся тревога, которая будет срабатывать каждый день в одно и то же время. Например: просыпаться в 6 утра каждый день.

Я впервые заметил проблему после перехода на летнее время. У меня был бы сигнал тревоги, который я создал в декабре (например), чтобы сработать в 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 Ответ

1 голос
/ 18 июня 2011

Возможно, вы используете формат, который не учитывает часовой пояс при сохранении вашей даты.

Почему бы вам не NSLog ваш NSDate таймера timerRec напрямую вместо использования NSDateFormatter? Кроме того, регистрация NSDate напрямую отобразит информацию о часовом поясе + DST о NSDate в консоли, тогда как NSDateFromatterMediumStyle, который вы используете, не делает этого (использование этого стиля даты, очевидно, действительно не лучший стиль для отладки таких проблем, связанных с TZ & DST). !)

...