Before
extension Calendar {
static let iso8601 = Calendar(identifier: .iso8601)
}
extension Date {
func startOfWeek(using calendar: Calendar = .iso8601) -> Date {
calendar.date(from: calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
}
}
private func getDateRange(weeksAgo: Int) -> ClosedRange<Date> {
let startOfThisWeek = Date().startOfWeek()
let oneWeekDuration: Int = 7 * 24 * 60 * 60
let oneDayDuration: Int = 24 * 60 * 60
let beginningOfWeek = startOfThisWeek.advanced(by: Double(-oneWeekDuration * weeksAgo))
// oneDayDuration makes sure the endOfWeek isn't exactly the start of the next week
let advancedShift: Int = -oneWeekDuration * (weeksAgo - 1) - oneDayDuration
let endOfWeek = startOfThisWeek.advanced(by: TimeInterval(advancedShift))
let dateRange = beginningOfWeek...endOfWeek
return dateRange
}
After
- goal is to get rid of these untrue manual calculations, force unwrapping and such
- looking for suggestions to improve the below
private func getDateInterval(weeksAgo: Int) -> DateInterval? {
let calendar = Calendar.current
guard
let dateAssociatedWithWeek = calendar.date(byAdding: .weekOfYear, value: -weeksAgo, to: Date()),
let dateInterval = calendar.dateInterval(of: .weekOfYear, for: dateAssociatedWithWeek),
// simulation of open range; as per what API wants
let newDateIntervalStart = calendar.date(byAdding: .day, value: 1, to: dateInterval.start)
else { return nil }
return DateInterval(start: newDateIntervalStart, end: dateInterval.end)
}