2015-08-26 98 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對象並訪問這個擴展的'tuesday'屬性時,我提前一個月收到一個日期。

(今天的日期 - 「2015年8月26日,16:42」) (週二日 - 「2015年9月26日,16:42」)

是什麼造成了一個月的這種進步?有沒有辦法通過擴展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這是會採取提供的日期,並根據日期組件添加了許多的時間單位來了。這些日期組件被要求爲CalendarUnitWeekdayCalendarUnitWeekdayOrdinal。你已經明確地將其中一個設置爲3,另一個設置爲當前日期。所以,當你添加它們時,你並沒有將星期幾設置爲3,而是將星期幾加入3(可能,我甚至不確定爲日期添加星期幾是有意義的,所以它可能不會這樣做 - 這可能是合乎邏輯的,爲什麼你移動一個月,它可能不會......)和另一個值的週日序數。這顯然不是你想要的。

取而代之,您應該找出當前的一週並添加/減少天數,直到您到達第一個下一個或前一個星期二。然後,一旦你在那裏,你可以合理地增加日期/星期到這個日期以獲得任何其他需要的日期。