67 lines
2.0 KiB
Swift
67 lines
2.0 KiB
Swift
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)
|
|
}
|
|
}
|