Calendar has convenience methods for that
dateIntervalOfWeekend(containing:start:interval:) checks if the given date is in a weekend and returns the startDate and interval(duration in seconds) in the inout parameters. The Bool return value is true if the given date is within a weekend.
nextWeekend(startingAfter:start:interval:) returns startDate und interval in the inout parameters for the upcoming (.forward parameter) or passed (.backward) weekend.
let now = Date()
var startDate = Date()
var interval : TimeInterval = 0.0
if !Calendar.current.dateIntervalOfWeekend(containing: now, start: &startDate, interval: &interval) {
Calendar.current.nextWeekend(startingAfter: now, start: &startDate, interval: &interval, direction: .forward)
}
print(startDate, startDate.addingTimeInterval(interval))
If you need start of Saturday and start of Sunday then replace the last line with
let endDate = startDate.addingTimeInterval(interval-1)
print(startDate, Calendar.current.startOfDay(for: endDate))
Alternatively – suggested by Martin R (thanks) – use dateIntervalOfWeekend(containing:) / nextWeekend(startingAfter:) which both return a DateInterval object containing start, end and duration
let now = Date()
let calendar = Calendar.current
let weekEndInterval = calendar.dateIntervalOfWeekend(containing: now) ?? calendar.nextWeekend(startingAfter: now)!
let startDate = weekEndInterval.start
let endDate = startDate.addingTimeInterval(weekEndInterval.duration-1)
print(startDate, calendar.startOfDay(for: endDate))