|
|
|
@ -102,100 +102,100 @@ extension Date { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static var firstDayOfWeek = Calendar.current.firstWeekday |
|
|
|
static var firstDayOfWeek = Calendar.current.firstWeekday |
|
|
|
static var capitalizedFirstLettersOfWeekdays: [String] { |
|
|
|
static var capitalizedFirstLettersOfWeekdays: [String] { |
|
|
|
let calendar = Calendar.current |
|
|
|
let calendar = Calendar.current |
|
|
|
// let weekdays = calendar.shortWeekdaySymbols |
|
|
|
// let weekdays = calendar.shortWeekdaySymbols |
|
|
|
|
|
|
|
|
|
|
|
// return weekdays.map { weekday in |
|
|
|
// return weekdays.map { weekday in |
|
|
|
// guard let firstLetter = weekday.first else { return "" } |
|
|
|
// guard let firstLetter = weekday.first else { return "" } |
|
|
|
// return String(firstLetter).capitalized |
|
|
|
// return String(firstLetter).capitalized |
|
|
|
// } |
|
|
|
// } |
|
|
|
// Adjusted for the different weekday starts |
|
|
|
// Adjusted for the different weekday starts |
|
|
|
var weekdays = calendar.veryShortStandaloneWeekdaySymbols |
|
|
|
var weekdays = calendar.veryShortStandaloneWeekdaySymbols |
|
|
|
if firstDayOfWeek > 1 { |
|
|
|
if firstDayOfWeek > 1 { |
|
|
|
for _ in 1..<firstDayOfWeek { |
|
|
|
for _ in 1..<firstDayOfWeek { |
|
|
|
if let first = weekdays.first { |
|
|
|
if let first = weekdays.first { |
|
|
|
weekdays.append(first) |
|
|
|
weekdays.append(first) |
|
|
|
weekdays.removeFirst() |
|
|
|
weekdays.removeFirst() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return weekdays.map { $0.capitalized } |
|
|
|
return weekdays.map { $0.capitalized } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static var fullMonthNames: [String] { |
|
|
|
static var fullMonthNames: [String] { |
|
|
|
let dateFormatter = DateFormatter() |
|
|
|
let dateFormatter = DateFormatter() |
|
|
|
dateFormatter.locale = Locale.current |
|
|
|
dateFormatter.locale = Locale.current |
|
|
|
|
|
|
|
|
|
|
|
return (1...12).compactMap { month in |
|
|
|
return (1...12).compactMap { month in |
|
|
|
dateFormatter.setLocalizedDateFormatFromTemplate("MMMM") |
|
|
|
dateFormatter.setLocalizedDateFormatFromTemplate("MMMM") |
|
|
|
let date = Calendar.current.date(from: DateComponents(year: 2000, month: month, day: 1)) |
|
|
|
let date = Calendar.current.date(from: DateComponents(year: 2000, month: month, day: 1)) |
|
|
|
return date.map { dateFormatter.string(from: $0) } |
|
|
|
return date.map { dateFormatter.string(from: $0) } |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var startOfMonth: Date { |
|
|
|
var startOfMonth: Date { |
|
|
|
Calendar.current.dateInterval(of: .month, for: self)!.start |
|
|
|
Calendar.current.dateInterval(of: .month, for: self)!.start |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var endOfMonth: Date { |
|
|
|
var endOfMonth: Date { |
|
|
|
let lastDay = Calendar.current.dateInterval(of: .month, for: self)!.end |
|
|
|
let lastDay = Calendar.current.dateInterval(of: .month, for: self)!.end |
|
|
|
return Calendar.current.date(byAdding: .day, value: -1, to: lastDay)! |
|
|
|
return Calendar.current.date(byAdding: .day, value: -1, to: lastDay)! |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var startOfPreviousMonth: Date { |
|
|
|
var startOfPreviousMonth: Date { |
|
|
|
let dayInPreviousMonth = Calendar.current.date(byAdding: .month, value: -1, to: self)! |
|
|
|
let dayInPreviousMonth = Calendar.current.date(byAdding: .month, value: -1, to: self)! |
|
|
|
return dayInPreviousMonth.startOfMonth |
|
|
|
return dayInPreviousMonth.startOfMonth |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var numberOfDaysInMonth: Int { |
|
|
|
var numberOfDaysInMonth: Int { |
|
|
|
Calendar.current.component(.day, from: endOfMonth) |
|
|
|
Calendar.current.component(.day, from: endOfMonth) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// var sundayBeforeStart: Date { |
|
|
|
// var sundayBeforeStart: Date { |
|
|
|
// let startOfMonthWeekday = Calendar.current.component(.weekday, from: startOfMonth) |
|
|
|
// let startOfMonthWeekday = Calendar.current.component(.weekday, from: startOfMonth) |
|
|
|
// let numberFromPreviousMonth = startOfMonthWeekday - 1 |
|
|
|
// let numberFromPreviousMonth = startOfMonthWeekday - 1 |
|
|
|
// return Calendar.current.date(byAdding: .day, value: -numberFromPreviousMonth, to: startOfMonth)! |
|
|
|
// return Calendar.current.date(byAdding: .day, value: -numberFromPreviousMonth, to: startOfMonth)! |
|
|
|
// } |
|
|
|
// } |
|
|
|
// New to accomodate for different start of week days |
|
|
|
// New to accomodate for different start of week days |
|
|
|
var firstWeekDayBeforeStart: Date { |
|
|
|
var firstWeekDayBeforeStart: Date { |
|
|
|
let startOfMonthWeekday = Calendar.current.component(.weekday, from: startOfMonth) |
|
|
|
let startOfMonthWeekday = Calendar.current.component(.weekday, from: startOfMonth) |
|
|
|
let numberFromPreviousMonth = startOfMonthWeekday - Self.firstDayOfWeek |
|
|
|
let numberFromPreviousMonth = startOfMonthWeekday - Self.firstDayOfWeek |
|
|
|
return Calendar.current.date(byAdding: .day, value: -numberFromPreviousMonth, to: startOfMonth)! |
|
|
|
return Calendar.current.date(byAdding: .day, value: -numberFromPreviousMonth, to: startOfMonth)! |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var calendarDisplayDays: [Date] { |
|
|
|
var calendarDisplayDays: [Date] { |
|
|
|
var days: [Date] = [] |
|
|
|
var days: [Date] = [] |
|
|
|
// Current month days |
|
|
|
// Current month days |
|
|
|
for dayOffset in 0..<numberOfDaysInMonth { |
|
|
|
for dayOffset in 0..<numberOfDaysInMonth { |
|
|
|
let newDay = Calendar.current.date(byAdding: .day, value: dayOffset, to: startOfMonth) |
|
|
|
let newDay = Calendar.current.date(byAdding: .day, value: dayOffset, to: startOfMonth) |
|
|
|
days.append(newDay!) |
|
|
|
days.append(newDay!) |
|
|
|
} |
|
|
|
} |
|
|
|
// previous month days |
|
|
|
// previous month days |
|
|
|
for dayOffset in 0..<startOfPreviousMonth.numberOfDaysInMonth { |
|
|
|
for dayOffset in 0..<startOfPreviousMonth.numberOfDaysInMonth { |
|
|
|
let newDay = Calendar.current.date(byAdding: .day, value: dayOffset, to: startOfPreviousMonth) |
|
|
|
let newDay = Calendar.current.date(byAdding: .day, value: dayOffset, to: startOfPreviousMonth) |
|
|
|
days.append(newDay!) |
|
|
|
days.append(newDay!) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Fixed to accomodate different weekday starts |
|
|
|
// Fixed to accomodate different weekday starts |
|
|
|
return days.filter { $0 >= firstWeekDayBeforeStart && $0 <= endOfMonth }.sorted(by: <) |
|
|
|
return days.filter { $0 >= firstWeekDayBeforeStart && $0 <= endOfMonth }.sorted(by: <) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var monthInt: Int { |
|
|
|
var monthInt: Int { |
|
|
|
Calendar.current.component(.month, from: self) |
|
|
|
Calendar.current.component(.month, from: self) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var yearInt: Int { |
|
|
|
var yearInt: Int { |
|
|
|
Calendar.current.component(.year, from: self) |
|
|
|
Calendar.current.component(.year, from: self) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var dayInt: Int { |
|
|
|
var dayInt: Int { |
|
|
|
Calendar.current.component(.day, from: self) |
|
|
|
Calendar.current.component(.day, from: self) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var startOfDay: Date { |
|
|
|
var startOfDay: Date { |
|
|
|
Calendar.current.startOfDay(for: self) |
|
|
|
Calendar.current.startOfDay(for: self) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func endOfDay() -> Date { |
|
|
|
func endOfDay() -> Date { |
|
|
|
let calendar = Calendar.current |
|
|
|
let calendar = Calendar.current |
|
|
|
@ -206,6 +206,11 @@ extension Date { |
|
|
|
let calendar = Calendar.current |
|
|
|
let calendar = Calendar.current |
|
|
|
return calendar.date(bySettingHour: 9, minute: 0, second: 0, of: self)! |
|
|
|
return calendar.date(bySettingHour: 9, minute: 0, second: 0, of: self)! |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func atEightAM() -> Date { |
|
|
|
|
|
|
|
let calendar = Calendar.current |
|
|
|
|
|
|
|
return calendar.date(bySettingHour: 8, minute: 0, second: 0, of: self)! |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extension Date { |
|
|
|
extension Date { |
|
|
|
|