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

Проверьте, есть ли дата до текущей даты (Swift)

Я хотел бы проверить, является ли NSDate раньше (в прошлом), сравнивая его с текущей датой. Как мне это сделать?

Спасибо

4b9b3361

Ответ 1

Я нахожу метод earlierDate.

if date1.earlierDate(date2).isEqualToDate(date1)  {
     print("date1 is earlier than date2")
}

У вас также есть метод laterDate.

Свифт 3 на Свифт 5:

if date1 < date2  {
     print("date1 is earlier than date2")
}

Ответ 2

Существует простой способ сделать это. (Swift 3 еще проще, проверьте в конце ответа)

Быстрый код:

if myDate.timeIntervalSinceNow.isSignMinus {
    //myDate is earlier than Now (date and time)
} else {
    //myDate is equal or after than Now (date and time)
}

Если вам нужна дата сравнения без времени ( "MM/dd/yyyy" ).

Быстрый код:

//Ref date
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let someDate = dateFormatter.dateFromString("03/10/2015")

//Get calendar
let calendar = NSCalendar.currentCalendar()

//Get just MM/dd/yyyy from current date
let flags = NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear
let components = calendar.components(flags, fromDate: NSDate())

//Convert to NSDate
let today = calendar.dateFromComponents(components)

if someDate!.timeIntervalSinceDate(today!).isSignMinus {
    //someDate is berofe than today
} else {
    //someDate is equal or after than today
} 

Apple docs ссылку здесь.

Изменить 1: Важно

От Swift 3 примечания по миграции:

Мигратор консервативен, но есть некоторые виды использования NSDate, которые имеют лучшие представления в Swift 3:
(x as NSDate).earlierDate(y) можно изменить на x < y ? x : y
(x as NSDate).laterDate(y) можно изменить на x < y ? y : x

Итак, в Swift 3 вы можете использовать операторы сравнения.

Ответ 3

Если вам нужно сравнить одну дату с теперь без создания нового объекта Date, вы можете просто использовать это в Swift 3:

if (futureDate.timeIntervalSinceNow.sign == .plus) {
    // date is in future
}

и

if (dateInPast.timeIntervalSinceNow.sign == .minus) {
    // date is in past
}

Ответ 4

Вам не нужно расширять NSDate здесь, просто используйте "сравнить", как показано в docs.

Например, в Swift:

if currentDate.compare(myDate) == NSComparisonResult.OrderedDescending {
    println("myDate is earlier than currentDate")
}

Ответ 5

Вы можете расширить NSDate, чтобы соответствовать протоколам Equatable и Comparable. Это протоколы сравнения в Swift и позволяют знакомым операторам сравнения (==, <, > и т.д.) Работать с датами. Поместите следующее в файл с соответствующим именем, например. NSDate+Comparison.swift в вашем проекте:

extension NSDate: Equatable {}
extension NSDate: Comparable {}

public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSince1970 == rhs.timeIntervalSince1970
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSince1970 < rhs.timeIntervalSince1970
}

Теперь вы можете проверить, есть ли одна дата перед другой со стандартными операторами сравнения.

let date1 = NSDate(timeIntervalSince1970: 30)
let date2 = NSDate()

if date1 < date2 {
    print("ok")
}

Информацию о расширениях в Swift см. здесь . Информацию о равных и сравниваемых протоколах см. Здесь здесь и здесь.

Примечание. В этом случае мы не создаем настраиваемые операторы, просто расширяя существующий тип для поддержки существующих операторов.

Ответ 6

В Swift 4 вы можете использовать этот код

if endDate.timeIntervalSince(startDate).sign == FloatingPointSign.minus {
    // endDate is in past
}

Ответ 7

В Swift5

    let nextDay = Calendar.current.date(byAdding: .day, value: -1, to: Date())
    let toDay = Date()
    print(toDay)
    print(nextDay!)

    if nextDay! < toDay  {
        print("date1 is earlier than date2")
    }


    let nextDay = Calendar.current.date(byAdding: .month, value: 1, to: Date())
    let toDay = Date()
    print(toDay)
    print(nextDay!)

    if nextDay! >= toDay  {
        print("date2 is earlier than date1")
    }

Ответ 8

Вот расширение в Swift, чтобы проверить, является ли дата более поздней.

extension Date {
    var isPastDate: Bool {
        return self < Date()
    }
}

Использование:

let someDate = Date().addingTimeInterval(1)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    print(date.isPastDate)
}

Ответ 9

Сделал быструю Swift 2.3 функцию из этого

// if you omit last parameter you comare with today
// use "11/20/2016" for 20 nov 2016
func dateIsBefore(customDate:String, referenceDate:String="today") -> Bool {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MM/dd/yyyy"

    let myDate = dateFormatter.dateFromString(customDate)
    let refDate = referenceDate == "today"
        ? NSDate()
        : dateFormatter.dateFromString(referenceDate)

    if NSDate().compare(myDate!) == NSComparisonResult.OrderedDescending {
        return false
    } else {
        return true
    }
}

Используйте его так, чтобы увидеть, была ли ваша дата до сегодняшнего дня.

if dateIsBefore("12/25/2016") {
    print("Not Yet Christmas 2016 :(")
} else {
    print("Christmas Or Later!")
}

Или с пользовательской контрольной датой

if dateIsBefore("12/25/2016", referenceDate:"12/31/2016") {
    print("Christmas comes before new years!")
} else {
    print("Something is really wrong with the world...")
}