Программно получать дату "в следующее воскресенье в 5 вечера"

99
12

Отредактировано 07/08/13: Apple имеет отличный набор видеороликов WWDC, которые действительно помогли мне понять различные классы даты и времени в Objective-C и как правильно выполнять вычисления времени/манипуляции с ними.


"Решение общих проблем времени и времени" (HD-видео, SD-видео, слайды (PDF)) (WWDC 2013)
"Выполнение расчётов календаря" (SD-видео, слайды (PDF)) (WWDC 2011)


Примечание. Ссылки требуют бесплатного членства в Apple Developer.


Я пишу приложение для подкаста для друзей. Она транслирует свое шоу в прямом эфире каждое воскресенье в 5 вечера, и я хотел бы написать код в своем приложении, чтобы по желанию назначить локальное уведомление за это время, чтобы пользователь напомнил, когда будет показано следующее живое шоу. Как я могу получить объект NSDate, который представляет "следующее воскресенье, в 17:00 по тихоокеанскому времени". (очевидно, это нужно было бы преобразовать в любой часовой пояс, который использует пользователь)

спросил(а) 2020-04-03T23:14:19+03:00 5 месяцев, 4 недели назад
1
Решение
155

Сначала получите текущий день недели:


NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

NSDateComponents *dateComponents = [calendar components:NSCalendarUnitWeekday | NSCalendarUnitHour fromDate:now];
NSInteger weekday = [dateComponents weekday];


Документы Apple определяют день недели как:


Единицы буднего дня - это числа от 1 до n, где n - количество дней в неделю. Например, в григорианском календаре n равно 7 и Воскресенье представлено 1.


Далее укажите, сколько дней нужно добавить, чтобы добраться до следующего воскресенья в 5:


NSDate *nextSunday = nil;
if (weekday == 1 && [dateComponents hour] < 5) {
// The next Sunday is today
nextSunday = now;
} else {
NSInteger daysTillNextSunday = 8 - weekday;
int secondsInDay = 86400; // 24 * 60 * 60
nextSunday = [now dateByAddingTimeInterval:secondsInDay * daysTillNextSunday];
}

Чтобы получить его в 5:00, вы можете просто изменить час и минуту на nextSunday до 5:00. Посмотрите текущую дату с [NSDate date], но установите время до 10:00 утра

ответил(а) 2020-04-03T23:34:09.841384+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема