Правильный способ отображения времени суток для будильника - PullRequest
1 голос
/ 16 октября 2010

Я пытаюсь кодировать часть программы, которая позволяет пользователям настраивать один или несколько сигналов тревоги, которые будут напоминать им о запуске приложения и делать что-то в определенное время дня.

Я в основном понимаю, чтоМне нужно использовать локальные уведомления, но мне трудно найти лучший способ правильно представить время суток в настройках моего приложения.

Например, я пробовал такого родавещь, которая должна представлять 8:00

[NSDate dateWithTimeIntervalSince1970:(8 * 60 * 60)]

Но проблема в том, что это означает 8:00 по Гринвичу, а не в местном часовом поясе, поэтому, когда я передаю это в NSDateFormatter, я получаю 3:00 утра, например, вмой часовой пояс.

По сути, я знаю, что мне нужно что-то сделать с NSCalendar, NSDate и NSTimeInterval и, возможно, NSDateComponents, но я не могу предложить самый простой подходк этому, что позволит мне рассчитать планирование NSDates для локальных уведомлений iOS.

Так что я думаю, к чему это сводится, как я представляю 8:00 утра, например, в системном часовом поясеe таким образом, что NSDateFormatter будет правильно форматировать его как местное время?

Похоже, я должен быть в состоянии понять это, но, может быть, это слишком поздно вечером ....

1 Ответ

2 голосов
/ 16 октября 2010

Например, я пытался представить что-то вроде 8:00 утра

[NSDate dateWithTimeIntervalSince1970:(8 * 60 * 60)]

Но проблема в том, что это означает 8 часов утра по Гринвичу, а не в местном часовом поясе ...

Нет, проблема в том, что это означает 8 часов утра по Гринвичу 1 января 1970 года.

Объект NSDate не выражен ни в каком календаре или часовом поясе. Объект NSDate - это исторический момент, не более того. Вам нужен объект календаря, чтобы преобразовать его в представление календаря или из него (например, год, месяц, день месяца, час, минута, секунда) или средство форматирования даты, чтобы преобразовать его в строковое представление или из него (например, «2010-10-15T22: 29: 27-0700».)

Если вы хотите вычислить NSDate для 8 утра сегодня, создайте объект NSCalendar и спросите его, когда это . Используйте components:fromDate:, чтобы повернуть прямо сейчас ([NSDate date]) в компоненты даты, затем переписать часы, минуты и секунды и преобразовать обратно.

UIDatePicker (такой, который вы, вероятно, должны представить пользователю, чтобы он мог выбрать дату и время их тревоги), даст вам NSDate; нет необходимости выполнять какие-либо преобразования или манипуляции с ним. Максимум, что вам может понадобиться, это вычесть некоторое время, если пользователь решил, чтобы вы включили будильник намного раньше фактического события.

Итак, я думаю, что все сводится к тому, как мне представить 8:00 утра, например, в системном часовом поясе таким образом, чтобы NSDateFormatter правильно отформатировал его как местное время?

NSDateFormatter принимает NSDate, и, как я уже сказал, NSDates не находятся в часовом поясе. Как вы видели, ваш форматировщик даты будет использовать часовой пояс пользователя по умолчанию (хотя это явно не указано в документации). Чтобы форматировщик даты использовал что-то другое, вы должны были бы сделать это.

...