import Foundation extension Date { func addingDays(_ days: Int) -> Date { Calendar.current.date(byAdding: .day, value: days, to: self)! } func addingMinutes(_ minutes: Int) -> Date { Calendar.current.date(byAdding: .minute, value: minutes, to: self)! } func startOfWeek() -> Date { let calendar = Calendar.current var cal = calendar cal.firstWeekday = 2 // Monday let components = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self) return cal.date(from: components) ?? self } func dayOfWeekIndex() -> Int { let calendar = Calendar.current let weekday = calendar.component(.weekday, from: self) // Convert to 0=Monday format return (weekday + 5) % 7 } var isToday: Bool { Calendar.current.isDateInToday(self) } var isPast: Bool { self < Calendar.current.startOfDay(for: Date()) } func formattedWeekRange() -> String { let endDate = self.addingDays(6) let formatter = DateFormatter() formatter.locale = Locale.current let dayFormatter = DateFormatter() dayFormatter.dateFormat = "d" let monthFormatter = DateFormatter() monthFormatter.dateFormat = "MMM" let startDay = dayFormatter.string(from: self) let endDay = dayFormatter.string(from: endDate) let month = monthFormatter.string(from: endDate) return "\(startDay)-\(endDay) \(month)" } func startOfMonth() -> Date { let calendar = Calendar.current let components = calendar.dateComponents([.year, .month], from: self) return calendar.date(from: components) ?? self } func addingMonths(_ months: Int) -> Date { Calendar.current.date(byAdding: .month, value: months, to: self) ?? self } func monthYearLabel(locale: Locale = .current) -> String { let formatter = DateFormatter() formatter.locale = locale formatter.setLocalizedDateFormatFromTemplate("LLLL yyyy") return formatter.string(from: self) } } func combineDateAndTime(date: Date, time: Date) -> Date { let calendar = Calendar.current let dateComponents = calendar.dateComponents([.year, .month, .day], from: date) let timeComponents = calendar.dateComponents([.hour, .minute], from: time) var combined = DateComponents() combined.year = dateComponents.year combined.month = dateComponents.month combined.day = dateComponents.day combined.hour = timeComponents.hour combined.minute = timeComponents.minute return calendar.date(from: combined) ?? date }