Je voudrais vérifier si un NSDate est avant (dans le passé) en le comparant à la date actuelle. Comment je ferais ça?
Merci
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")
}
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é enx < y ? x : y
(x as NSDate).laterDate(y)
peut être changé enx < y ? y : x
Ainsi, dans Swift 3, vous pouvez utiliser des opérateurs de comparaison.
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
}
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.
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")
}
Dans Swift 4, vous pouvez utiliser ce code
if endDate.timeIntervalSince(startDate).sign == FloatingPointSign.minus {
// endDate is in past
}