Search code examples
swiftdatecalendar

How to get all days in current week in swift


I am making an application where I need to get the day of the year for all days in the current week. To achieve this, I am looking for a result similar to below (Today is Thursday the 23rd of March)

Monday = 79
Tuesday = 80
Wednesday = 81
Thursday = 82
Friday = 83

Saturday and Sunday can be included, however my application only needs weekdays rather then weekends. Today is day 82


Solution

  • To get the weekdays of the week, it is:

    let calendar = Calendar.current
    let today = calendar.startOfDay(for: Date())
    let dayOfWeek = calendar.component(.weekday, from: today)
    let dates = calendar.range(of: .weekday, in: .weekOfYear, for: today)!
        .compactMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: today) }
        .filter { !calendar.isDateInWeekend($0) }
    

    To display that as “Thursday = 82”, it is:

    let formatter = DateFormatter()
    formatter.dateFormat = "eeee' = 'D"
    for date in dates {
        print(formatter.string(from: date))
    }
    

    Or

    let strings = dates.map { formatter.string(from: $0) }
    

    If you want it to consider firstWeekday (generally only a concern if you are no longer filtering weekends out of the results, hence no filter on isDateInWeekend, below):

    let calendar = Calendar.current
    let today = calendar.startOfDay(for: Date())
    let todaysDayOfWeek = calendar.component(.weekday, from: today)
    guard
        let weekdaysRange = calendar.range(of: .weekday, in: .weekOfYear, for: today),
        let index = weekdaysRange.firstIndex(of: calendar.firstWeekday)
    else { return }
    let weekdays = weekdaysRange[index...] + weekdaysRange[..<index].map { $0 + weekdaysRange.count }
    let dates = weekdays.compactMap { calendar.date(byAdding: .day, value: $0 - todaysDayOfWeek, to: today) }