import Foundation extension Date { func formattedDate() -> String { let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .short return formatter.string(from: self) } func formattedTime() -> String { let formatter = DateFormatter() formatter.dateStyle = .none formatter.timeStyle = .short return formatter.string(from: self) } func isSameDay(as other: Date) -> Bool { Calendar.current.isDate(self, inSameDayAs: other) } func formatDate() -> String { let formatter = DateFormatter() formatter.dateStyle = .medium formatter.timeStyle = .none return formatter.string(from: self) } var abbreviatedMonth: String { let formatter = DateFormatter() formatter.dateFormat = "MMM" return formatter.string(from: self) } var dayOfMonth: Int { Calendar.current.component(.day, from: self) } var abbreviatedWeekday: String { let formatter = DateFormatter() formatter.dateFormat = "EEE" return formatter.string(from: self) } func humanTimeInterval(to other: Date) -> String { let interval = other.timeIntervalSince(self) let hours = Int(interval) / 3600 let minutes = (Int(interval) % 3600) / 60 if hours > 0 { return "\(hours)h \(minutes)m" } else { return "\(minutes)m" } } }