web-dev-qa-db-fra.com

Vérifier si la date est antérieure à la date actuelle (Swift)

Je voudrais vérifier si un NSDate est avant (dans le passé) en le comparant à la date actuelle. Comment je ferais ça?

Merci

31
Tom Coomer

Je trouve la méthode earlyDate.

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

Vous avez aussi le laterDate

Switf3:

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

Il existe un moyen simple de le faire. (Swift 3 est encore plus simple, vérifiez à la fin de la réponse)

Code rapide:

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

Si vous avez besoin de comparer la date sans heure ("MM/jj/aaaa").

Code rapide:

//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
} 

Lien de la documentation Apple ici .

Edit 1: Important

De Swift 3 notes de migration :

Le migrateur est conservateur, mais certaines utilisations de NSDate ont de meilleures représentations dans Swift 3:
(x as NSDate).earlierDate(y) peut être changé en x < y ? x : y
(x as NSDate).laterDate(y) peut être changé en x < y ? y : x

Ainsi, dans Swift 3, vous pouvez utiliser des opérateurs de comparaison.

32
Vagner

Si vous avez besoin de comparer une date avec maintenant sans créer d'objet Date, vous pouvez simplement l'utiliser dans Swift 3:

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

et 

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

Vous pouvez étendre NSDate pour qu’il soit conforme aux protocoles Equatable et Comparable. Ce sont des protocoles de comparaison dans Swift et permettent aux opérateurs de comparaison habituels (==, <,> etc.) de travailler avec des dates. Placez les éléments suivants dans un fichier nommé, par exemple: NSDate+Comparison.Swift dans votre projet:

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
}

Vous pouvez maintenant vérifier si une date est antérieure à une autre avec les opérateurs de comparaison standard.

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

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

Pour plus d'informations sur les extensions dans Swift, voir ici . Pour des informations sur les protocoles Equatable et Comparable, voir ici et ici , respectivement. 

Note: dans ce cas, nous ne créons pas d'opérateurs personnalisés, mais étendons simplement un type existant pour prendre en charge des opérateurs existants.

9
mustafa

Vous n'avez pas besoin d'étendre NSDate ici, utilisez simplement "comparer" comme illustré dans les docs .

Par exemple, dans Swift:

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

Dans Swift 4, vous pouvez utiliser ce code

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