Ich möchte prüfen, ob ein NSDate vor (in der Vergangenheit) liegt, indem ich es mit dem aktuellen Datum vergleiche. Wie würde ich das machen?
Vielen Dank
Ich finde die beforeDate-Methode.
if date1.earlierDate(date2).isEqualToDate(date1) {
print("date1 is earlier than date2")
}
Sie haben auch das spätere Datum
Switf3:
if date1 < date2 {
print("date1 is earlier than date2")
}
Es gibt einen einfachen Weg, dies zu tun. (Swift 3 ist noch einfacher, überprüfen Sie am Ende der Antwort)
SWIFT-Code:
if myDate.timeIntervalSinceNow.isSignMinus {
//myDate is earlier than Now (date and time)
} else {
//myDate is equal or after than Now (date and time)
}
Wenn Sie ein Datum ohne Uhrzeit vergleichen möchten ("MM/TT/JJJJ").
SWIFT-Code:
//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-Dokumente Link hier .
Edit 1: Wichtig
Aus Swift 3 Migrationshinweise :
Der Migrator ist konservativ, aber es gibt einige Verwendungsmöglichkeiten von NSDate, die in Swift 3 besser dargestellt werden:
(x as NSDate).earlierDate(y)
kann inx < y ? x : y
geändert werden(x as NSDate).laterDate(y)
kann inx < y ? y : x
geändert werden
In Swift 3 können Sie Vergleichsoperatoren verwenden.
Wenn Sie ein Datum mit jetzt vergleichen müssen, ohne ein neues Date-Objekt zu erstellen, können Sie dies einfach in Swift 3 verwenden:
if (futureDate.timeIntervalSinceNow.sign == .plus) {
// date is in future
}
und
if (dateInPast.timeIntervalSinceNow.sign == .minus) {
// date is in past
}
Sie können NSDate
erweitern, um den Protokollen Equatable
und Comparable
zu entsprechen. Dies sind Vergleichsprotokolle in Swift und ermöglichen es den bekannten Vergleichsoperatoren (==, <,> usw.), mit Datumsangaben zu arbeiten. Fügen Sie das Folgende in eine entsprechend benannte Datei ein, z. NSDate+Comparison.Swift
in Ihrem Projekt:
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
}
Jetzt können Sie mit Standardvergleichsoperatoren überprüfen, ob ein Datum vor dem anderen liegt.
let date1 = NSDate(timeIntervalSince1970: 30)
let date2 = NSDate()
if date1 < date2 {
print("ok")
}
Informationen zu Erweiterungen in Swift finden Sie unter hier . Informationen zu den gleichwertigen und vergleichbaren Protokollen finden Sie unter hier und hier .
Note: In diesem Fall erstellen wir keine benutzerdefinierten Operatoren, sondern erweitern lediglich einen vorhandenen Typ, um vorhandene Operatoren zu unterstützen.
Sie müssen NSDate hier nicht erweitern, verwenden Sie einfach "compare", wie in docs dargestellt.
Zum Beispiel in Swift:
if currentDate.compare(myDate) == NSComparisonResult.OrderedDescending {
println("myDate is earlier than currentDate")
}
In Swift 4 können Sie diesen Code verwenden
if endDate.timeIntervalSince(startDate).sign == FloatingPointSign.minus {
// endDate is in past
}
In 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")
}