import Foundation extension Date { var startOfDay: Date { Calendar.current.startOfDay(for: self) } var endOfDay: Date { var components = DateComponents() components.day = 1 components.second = -1 return Calendar.current.date(byAdding: components, to: startOfDay) ?? self } var startOfWeek: Date { let calendar = Calendar.current let components = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self) return calendar.date(from: components) ?? self } var endOfWeek: Date { var components = DateComponents() components.day = 7 components.second = -1 return Calendar.current.date(byAdding: components, to: startOfWeek) ?? self } func formatted(style: DateFormatter.Style) -> String { let formatter = DateFormatter() formatter.dateStyle = style formatter.timeStyle = .none return formatter.string(from: self) } func formattedTime() -> String { let formatter = DateFormatter() formatter.dateStyle = .none formatter.timeStyle = .short return formatter.string(from: self) } func formattedDateTime() -> String { let formatter = DateFormatter() formatter.dateStyle = .medium formatter.timeStyle = .short return formatter.string(from: self) } var iso8601String: String { let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime] return formatter.string(from: self) } var iso8601FullDate: String { let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withFullDate] return formatter.string(from: self) } static func fromISO8601(_ string: String) -> Date? { let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime] return formatter.date(from: string) } }