Проверьте, нет ли даты между двумя датами
У меня есть этот код, в котором преобразование String в объект даты
let date2 = KeysData[indexPath.row]["starttime"] as? String
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
if let date = dateFormatter.dateFromString(date2!) {
println(date)
}
Я хотел бы знать, будет ли текущая дата находиться между двумя днями, которые я получил в массиве startdate
и endate
Ответы
Ответ 1
Swift 2
Для лучшего ответа см. Swift № 3.
У вас уже есть код для преобразования вашей строки даты в KeysData
в NSDate
. Предполагая, что у вас есть две даты в startdate
и enddate
, все, что вам нужно сделать, это проверить, находится ли текущая дата между:
let startDate = ...
let endDate = ...
NSDate().isBetween(date: startDate, andDate: endDate)
extension NSDate {
func isBetweeen(date date1: NSDate, andDate date2: NSDate) -> Bool {
return date1.compare(self) == self.compare(date2)
}
}
Редактировать: если вы хотите выполнить инклюзивную проверку диапазона, используйте это условие:
extension NSDate {
func isBetween(date date1: NSDate, andDate date2: NSDate) -> Bool {
return date1.compare(self).rawValue * self.compare(date2).rawValue >= 0
}
}
Ответ 2
Свифт № 3
Swift 3 делает это намного проще.
let fallsBetween = (startDate ... endDate).contains(Date())
Теперь, когда NSDate
соединен с типом значения Date
и Date
соответствует Comparable
мы можем просто сформировать ClosedRange<Date>
и использовать метод contains
чтобы увидеть, включена ли текущая дата.
Предостережение: endDate
должно быть больше или равно startDate
. В противном случае диапазон не может быть сформирован, и код fatalError
с fatalError
.
Это безопасно:
extension Date {
func isBetween(_ date1: Date, and date2: Date) -> Bool {
return (min(date1, date2) ... max(date1, date2)).contains(self)
}
}
Ответ 3
extension Date
{
func isBetween(startDate:Date, endDate:Date)->Bool
{
return (startDate.compare(self) == .orderedAscending) && (endDate.compare(self) == .orderedDescending)
}
}
Ответ 4
Для Swift 4.2 я использовал это расширение, основываясь на ответе выше:
extension Date {
func isBetween(_ date1: Date, and date2: Date) -> Bool {
return (min(date1, date2) ... max(date1, date2)) ~= self
}
Но будь осторожен. Если это расширение не включает вашу дату начала (date1), то проверьте время ваших дат. Может быть, вам нужно сократить время с даты, чтобы исправить это. Например, вот так:
let myDateWithoutTime = Calendar.current.startOfDay(for: myDate)
Ответ 5
extension Date {
func isBetweeen(date date1: Date, andDate date2: Date) -> Bool {
return date1.timeIntervalSince1970 < self.timeIntervalSince1970 && date2.timeIntervalSince1970 > self.timeIntervalSince1970
}
}