Время бежит неумолимо, начиная свой отсчёт со времён большого взрыва, для удобства подсчета оно поделено на отрезки равной длинны, (можно было и в секундах считать но часы бы на руку не помещались) одним из них является день. День это период времени равный 24 часам, у дня есть начало и если к нему прибавить 24 * 60 * 60 секунд мы получим его конец, что бы узнать попадает ли определенная дата в определенный день, мы не можем их просто сравнить т.к. день это отрезок, следовательно, дата попадающая в этот отрезок, должна быть больше начала дня и меньше его конца.
Ну и код выше можно переписать, используя преимущества свифта:
extension Date {
static func `init`(string: String) -> Date {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ"
return formatter.date(from: string)!
}
}
extension Date: Strideable {
private static let interval: TimeInterval = 60 * 60 * 24
public func distance(to other: Date) -> Int { // Количество дней от self до other
return Int((other.timeIntervalSince1970 - timeIntervalSince1970) / Date.interval)
}
public func advanced(by n: Int) -> Date { // Дата через n дней
return addingTimeInterval(TimeInterval(n) * Date.interval)
}
}
extension Array where Element == Date {
func contains(_ element: Date) -> Bool {
return sorted(by: <) // Сортируем
.last(where: { $0 < element }) // Ищем меньшую дату с конца
.map { element < $0.addingTimeInterval(60 * 60 * 24) } // Если найдена (не nil), проверим что element меньше чем меньшая дата + день
?? false
}
}
let from = Date.init(string: "2018-01-01 00:00:00+0000")
let to = Date.init(string: "2019-01-01 00:00:00+0000")
let array = Array(from..<to)
let today = Date()
if array.contains(today) {
print("Hello")
}