获取上周六和周日的上一周,下周和下一周

时间:2017-07-21 13:30:41

标签: ios swift nsdateformatter

我想显示从星期一星期五的日期/天数,不包括星期六/星期日,如下图所示。

enter image description here

我的情景:

  1. 当屏幕加载时,应显示当前周。
  2. 点击上一个按钮( DisplayedWeek - 1
  3. 点击下一步按钮( DisplayedWeek + 1 )。
  4. 我的工作

    经过一番研究,这就是我的尝试。

            let calendar = Calendar.current
    
            let currentDate = calendar.startOfDay(for: Date())
    
            /* value =  0 for current,
               value =  1 for next,
               value = -1 for previous week.
    
            */
            let nextWeek:Date =  calendar.date(byAdding: .weekOfMonth, value: 1, to: currentDate)! as Date
    
            let dayOfWeek = calendar.component(.weekday, from: nextWeek)
            let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: nextWeek)!
    
            let days = (weekdays.lowerBound ..< weekdays.upperBound).flatMap {
    
                calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: nextWeek)
    
            }.filter { !calendar.isDateInWeekend($0) }
    
            // Week Days from monday to friday
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyy-MM-dd"
    
            for date in days {
                print(formatter.string(from: date))
            }
    

    在我的情况下,如果日期星期六星期日,它应显示在下周,但它显示的是同一周。

1 个答案:

答案 0 :(得分:4)

您可以获得current week monday's date,只需添加n天:

Swift 4.1•Xcode 9.3或更高版本

extension Calendar {
    static let iso8601 = Calendar(identifier: .iso8601)
}
extension Date {
    var cureentWeekMonday: Date {
        return Calendar.iso8601.date(from: Calendar.iso8601.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
    }
    var currentWeekdays: [Date] {
        return (0...4).compactMap{ Calendar.iso8601.date(byAdding: DateComponents(day: $0), to: cureentWeekMonday) } // for Swift versions earlier than 4.1 use flatMap instead
    }
}
let currentWeekdays = Date().currentWeekdays
print(currentWeekdays)  // ["Jul 17, 2017, 12:00 AM", "Jul 18, 2017, 12:00 AM", "Jul 19, 2017, 12:00 AM", "Jul 20, 2017, 12:00 AM", "Jul 21, 2017, 12:00 AM"]