每周特定日期的 NSDate 扩展

NSDate extension for specific day of each week

我希望扩展 NSDate class 以便我能够将我们当前所在的每个星期二作为 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' 属性 时,我收到了提前一个月的日期。

(今天日期 - "Aug 26, 2015, 4:42 PM") (星期二日期 - "Sep 26, 2015, 4:42 PM")

是什么导致了一个月的提前?有没有办法通过扩展 NSDate return 我们所在的每周的特定日期 class?

谢谢

您正在使用 dateByAddingComponents,它将获取提供的日期并根据日期组件向其添加一些时间单位。这些日期组件已被请求为 CalendarUnitWeekdayCalendarUnitWeekdayOrdinal。您已明确将其中一个设置为 3,另一个设置为当前日期。所以,当你添加它们时,你并没有将工作日设置为 3,而是将 3 添加到工作日(可能,我什至不确定将工作日添加到日期是否有意义,所以它可能不会这样做- 为什么你移动一个月可能是合乎逻辑的,它可能不是......)和周数的另一个值。这显然不是你想要的。

相反,您应该找出当前的工作日并添加/减去天数,直到到达下一个或上一个星期二的第一个星期二。然后,一旦你到达那里,你可以理智地向这个日期添加天数/周数以获得任何其他需要的日期。

而不是使用 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)!
    }}