How to get all days in current week in swift
To get the weekdays of the week, it is:
let calendar = Calendar.currentlet today = calendar.startOfDay(for: Date())let dayOfWeek = calendar.component(.weekday, from: today)let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: today)!let days = (weekdays.lowerBound ..< weekdays.upperBound) .compactMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: today) } // use `flatMap` in Xcode versions before 9.3 .filter { !calendar.isDateInWeekend($0) }
To display that as "Thursday = 82", it is
let formatter = DateFormatter()formatter.dateFormat = "eeee' = 'D"for date in days { print(formatter.string(from: date))}
Or
let strings = days.map { formatter.string(from: $0) }
I had problems with adapting Rob's solution for when the week starts on Monday. This solution adapts to your calendar.firstWeekday
setting.
var calendar = Calendar.autoupdatingCurrentcalendar.firstWeekday = 2 // Start on Monday (or 1 for Sunday)let today = calendar.startOfDay(for: Date())var week = [Date]()if let weekInterval = calendar.dateInterval(of: .weekOfYear, for: today) { for i in 0...6 { if let day = calendar.date(byAdding: .day, value: i, to: weekInterval.start) { week += [day] } }}return week
I made a small extension on Calendar, which might be helpful for anyone else looking for a more functional solution to this.
import Foundationextension Calendar { func intervalOfWeek(for date: Date) -> DateInterval? { dateInterval(of: .weekOfYear, for: date) } func startOfWeek(for date: Date) -> Date? { intervalOfWeek(for: date)?.start } func daysWithSameWeekOfYear(as date: Date) -> [Date] { guard let startOfWeek = startOfWeek(for: date) else { return [] } return (0 ... 6).reduce(into: []) { result, daysToAdd in result.append(Calendar.current.date(byAdding: .day, value: daysToAdd, to: startOfWeek)) } .compactMap { $0 } }}