Подтвердить что ты не робот

Проверьте, нет ли даты между двумя датами

У меня есть этот код, в котором преобразование 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

4b9b3361

Ответ 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
    }

}