Расширение NSDate на определенный день каждой недели

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

Я понимаю, что это можно сделать с помощью NSDateComponents. Пока у меня есть следующее:

extension NSDate {

var tuesday: NSDate {

    let calendar = NSCalendar.currentCalendar()

    let todaysDate = NSDate()

    let weekdayComponents = calendar.components(.CalendarUnitWeekday | .CalendarUnitWeekdayOrdinal, fromDate: todaysDate)

    weekdayComponents.weekday = 3

    let returnTuesday = calendar.dateByAddingComponents(weekdayComponents, toDate: todaysDate, options: nil)

    return returnTuesday!
}}

Я считаю, что CalendarUnitWeekday работает в системе на основе индекса (т.е. воскресенье = 1, суббота = 7), поэтому я устанавливаю для вторника требуемый день недели равным 3.

Однако при инициализации объекта NSDate и доступе к этому расширенному свойству «вторник» я получаю дату за месяц вперед.

(сегодняшняя дата - «26 августа 2015 г., 16:42») (дата вторника - «26 сентября 2015 г., 16:42»)

Что вызывает это повышение на месяц? Есть ли способ вернуть конкретную дату каждой недели, в которой мы находимся, путем расширения класса NSDate?

Спасибо


person Stuart Pattison    schedule 26.08.2015    source источник


Ответы (2)


Вместо того, чтобы использовать dateByAddingComponents:, вы можете найти сегодняшний день недели и узнать его разницу с целевым днем ​​недели, а также обновить компонент дня. Требуемая дата может быть сгенерирована методом dateFomComponents с использованием параметра обновленных компонентов.

extension NSDate {

    var tuesday: NSDate {

        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(.CalendarUnitWeekday | .CalendarUnitDay | .CalendarUnitMonth | .CalendarUnitYear | .CalendarUnitHour | .CalendarUnitMinute, fromDate: NSDate())
        let targetDay = 3 //Required day
        let today = components.weekday

        if (targetDay < today) {
            components.day -= today - targetDay
        } else {
            components.day += targetDay - today
        }

        return calendar.dateFromComponents(components)!
    }}
person ImAshwyn    schedule 26.08.2015
comment
Именно то, что я ищу! Спасибо также за четкую разбивку. - person Stuart Pattison; 02.09.2015

Вы используете dateByAddingComponents, который будет использовать указанную дату и добавлять к ней несколько единиц времени на основе компонентов даты. Эти компоненты даты были запрошены как CalendarUnitWeekday и CalendarUnitWeekdayOrdinal. Вы явно установили для одного из них значение 3, а для другого - текущую дату. Итак, когда вы добавляете их, вы не устанавливаете день недели на 3, вы добавляете 3 к дню недели (вероятно, я даже не уверен, что добавление дня недели к дате имеет смысл, поэтому это может не делать этого - может быть логично, почему вы перемещаетесь на месяц, а может и нет ...) и другое значение в порядковый номер дня недели. Очевидно, это не то, что вам нужно.

Вместо этого вы должны узнавать текущий день недели и складывать / вычитать дни, пока не дойдете до первого следующего или предыдущего вторника. Затем, когда вы окажетесь там, вы можете разумно добавить дни / недели к этой дате, чтобы получить любые другие требуемые даты.

person Wain    schedule 26.08.2015