NSDate сдвигается назад или вперед на час в режиме полета или после перехода на летнее время.

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

Я впервые заметил проблему после перехода на летнее время. У меня был бы будильник, который я создал в декабре (например), чтобы он срабатывал в 6 утра каждое утро. После марша будильник стал срабатывать на 1 час раньше (может быть и позже, не помню). Но когда я пытался отладить проблему, этого никогда не происходило, и к тому времени, когда я сел, чтобы по-настоящему разобраться в ней, я не смог воспроизвести проблему.

В последнее время, когда я ложусь спать, я ставлю свой телефон в режим полета. Это, кажется, воспроизводит проблему гораздо чаще. Но бывают случаи, когда все работает нормально. Но если я проверю время будильника после того, как перейду в режим полета, оно окажется на час позже, чем я создал. NSDate появится в моей таблице будильников в 7 утра вместо 6 утра. Но иногда он появляется как 6 утра. Поэтому я включаю сигнализацию. Но на следующее утро будильник срабатывает в 7 утра.

Я думаю, что это связано с летним временем и телефоном, не знающим, находится ли он в летнее время для объекта NSDate. Однако на самом деле время, отображаемое на моем телефоне, никогда не было неправильным. Но у меня будильник срабатывает не вовремя.

Вот пример моего кода: Примечания: timerRec — это структурированная запись из моей базы данных. alarmTime — это объект NSDate, извлеченный из базы данных. подключен к отладчику, он никогда не подводил.

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 и как системные часы работают за кулисами в режиме полета.

Спасибо,

Кевин


person krason    schedule 16.06.2011    source источник


Ответы (1)


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

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

person AliSoftware    schedule 17.06.2011