2015-08-26 74 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(可能,我甚至不确定为日期添加星期几是有意义的,所以它可能不会这样做 - 这可能是合乎逻辑的,为什么你移动一个月,它可能不会......)和另一个值的周日序数。这显然不是你想要的。

取而代之,您应该找出当前的一周并添加/减少天数,直到您到达第一个下一个或前一个星期二。然后,一旦你在那里,你可以合理地增加日期/星期到这个日期以获得任何其他需要的日期。