2015-08-26 2 views
0

Я ищу, чтобы расширить класс 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, 4:42 PM") (дата вторнику - "Sep 26, 2015, 4:42 PM")

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

Благодаря

ответ

1

Вместо использования 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)! 
    }} 
+0

Именно то, что я ищу! Спасибо за четкую разбивку. –

0

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

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

Смежные вопросы