[Solved] How to get dates for every thursday or other day of week in specific month?


Short solution:


// Get current calendar and current date
let calendar = Calendar.current
let now = Date()
// Get the current date components for year, month, weekday and weekday ordinal
var components = calendar.dateComponents([.year, .month, .weekdayOrdinal, .weekday], from: now)
// get the range (number of occurrences) of the particular weekday in the month
let range = calendar.range(of: .weekdayOrdinal, in: .month, for: now)!
// Loop thru the range, set the components to the appropriate weekday ordinal and get the date
for ordinal in range.lowerBound..

Be aware that print prints dates always in UTC.

Edit:

range(of: .weekdayOrdinal, in: .month does not work, it returns 1..<6 regardless of the date.

This is a working alternative. It checks if the date exceeds the month bounds

// Get current calendar and date for 2017/4/13
let calendar = Calendar.current
let april13Components = DateComponents(year:2017, month:4, day:13)
let april13Date = calendar.date(from: april13Components)!

// Get the current date components for year, month, weekday and weekday ordinal
var components = calendar.dateComponents([.year, .month, .weekdayOrdinal, .weekday], from: april13Date)

// Loop thru the range, set the components to the appropriate weekday ordinal and get the date
for ordinal in 1..<6 { // maximum 5 occurrences
    components.weekdayOrdinal = ordinal
    let date = calendar.date(from: components)!
    if calendar.component(.month, from: date) != components.month! { break }
    print(calendar.date(from: components)!)
}

0

solved How to get dates for every thursday or other day of week in specific month?