【问题标题】:NSDate extension for specific day of each week每周特定日期的 NSDate 扩展
【发布时间】:2015-08-26 15:49:33
【问题描述】:

我希望扩展 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 类来返回我们所在的每周的特定日期?

谢谢

【问题讨论】:

    标签: ios swift nsdate nscalendar nsdatecomponents


    【解决方案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)!
        }}
    

    【讨论】:

    • 正是我要找的!也感谢您的明确细分。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2012-04-07
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多