85 lines
2.6 KiB
Swift
85 lines
2.6 KiB
Swift
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
|
|
}
|