NSDate с номера недели

Я пытаюсь создать еженедельное повторяющееся локальное уведомление с помощью Swift. Уведомление будет установлено на первый день каждой недели и в 10:00. Конечно, я не хочу устанавливать уведомление на прошлую дату, поэтому мне нужно посмотреть, прошел ли сейчас первый день недели в 10:00. Если нет, я создам уведомление на сегодня 10:00, иначе на следующей неделе понедельник 10:00.

Я создал расширение для расчета номера недели на текущую дату.

    extension NSDate {

        func weekOfYear() -> Int {
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(NSCalendarUnit.WeekOfYear, fromDate: self)
        let weekOfYear = components.weekOfYear

        return weekOfYear
        }
    }

Я не мог пойти дальше этого. Любая помощь приветствуется. С Уважением.


person ErkanA    schedule 29.10.2015    source источник


Ответы (1)


Есть более простое решение вашей проблемы. Вы можете использовать метод nextDateAfterDate() NSCalendar:

let cal = NSCalendar.currentCalendar()
let comps = NSDateComponents()
comps.hour = 10
comps.weekday = cal.firstWeekday

let now = NSDate()
let fireDate = cal.nextDateAfterDate(now, matchingComponents: comps, options: [.MatchNextTimePreservingSmallerUnits])!

Это дает первую дату в будущем, которая приходится на 10:00 первого дня недели.

person Martin R    schedule 29.10.2015
comment
Спасибо за быстрое и простое решение. Как насчет того, чтобы установить fireDate на следующий первый день месяца? - person ErkanA; 29.10.2015
comment
@ErkanA: comps.day = 1 вместо comps.weekday = cal.firstWeekday должно помочь. – Разве это не очевидно? :) - person Martin R; 29.10.2015
comment
Я думаю, что написал немного сумбурно. Мне нужно найти следующее вхождение в первый день месяца 10:00 (ежемесячное уведомление) - person ErkanA; 29.10.2015
comment
@ErkanA: Да, и с comps.hour = 10; comps.day = 1 вы должны получить такой результат. - person Martin R; 29.10.2015
comment
Я только что проверил и понял. Извините за опоздание, я работаю над своим первым проектом, и ясно, что мне нужно узнать намного больше о NSCalendar. Спасибо - person ErkanA; 29.10.2015