每周特定日期的NSDate延期

时间:2015-08-26 15:49:34

标签: ios swift nsdate nscalendar nsdatecomponents

我正在寻求扩展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对象并访问此扩展的“星期二”属性时,我会提前一个月收到日期。

(今天日期 - “2015年8月26日下午4:42”) (星期二日期 - “2015年9月26日,下午4:42”)

是什么导致了一个月的进步?有没有办法通过扩展NSDate类来返回我们每周的特定日期?

由于

2 个答案:

答案 0 :(得分: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)!
    }}

答案 1 :(得分:0)

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

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