Ich aktualisiere meine App auf die Swift 3.0-Syntax (ich weiß, dass sie sich noch in der Beta befindet, aber ich möchte darauf vorbereitet sein, sobald sie veröffentlicht wird).
Bis zur vorherigen Beta von Xcode (Beta 5) konnte ich zwei Date
Objekte mit den Operanden <
, >
und ==
vergleichen. Aber in der neuesten Beta (Beta 6) funktioniert das nicht mehr. Hier sind einige Screenshots:
Wie Sie in beiden Screenshots sehen können, handelt es sich um zwei Date
Objekte. Aber ich bekomme folgenden Fehler:
Was mache ich falsch? Die Funktionen sind noch in der Klasse Date
deklariert:
static func >(Date, Date)
Gibt true zurück, wenn das Datum auf der linken Seite später liegt als das Datum auf der rechten Seite.
Ist das nur ein Beta-Fehler oder mache ich etwas falsch?
Ich habe dieses Snippet (in XCode 8 Beta 6) ausprobiert, und es funktioniert einwandfrei.
let date1 = Date()
let date2 = Date().addingTimeInterval(100)
if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }
Date
ist Comparable
& Equatable
(ab Swift 3)Diese Antwort ergänzt die Antwort von @Ankit Thakur.
Seit Swift 3 übernimmt die Date
-Struktur (basierend auf der zugrunde liegenden NSDate
-Klasse) die Protokolle Comparable
und Equatable
.
Comparable
erfordert, dass Date
die Operatoren implementiert: <
, <=
, >
, >=
.Equatable
muss Date
den ==
-Operator implementieren.Equatable
ermöglicht Date
die Verwendung der Standardimplementierung des !=
-Operators (die Umkehrung der Equatable
==
-Operatorimplementierung).Der folgende Beispielcode führt diese Vergleichsoperatoren aus und bestätigt mit print
-Anweisungen, welche Vergleiche zutreffen.
import Foundation
func describeComparison(date1: Date, date2: Date) -> String {
var descriptionArray: [String] = []
if date1 < date2 {
descriptionArray.append("date1 < date2")
}
if date1 <= date2 {
descriptionArray.append("date1 <= date2")
}
if date1 > date2 {
descriptionArray.append("date1 > date2")
}
if date1 >= date2 {
descriptionArray.append("date1 >= date2")
}
if date1 == date2 {
descriptionArray.append("date1 == date2")
}
if date1 != date2 {
descriptionArray.append("date1 != date2")
}
return descriptionArray.joined(separator: ", ")
}
let now = Date()
describeComparison(date1: now, date2: now.addingTimeInterval(1))
// date1 < date2, date1 <= date2, date1 != date2
describeComparison(date1: now, date2: now.addingTimeInterval(-1))
// date1 > date2, date1 >= date2, date1 != date2
describeComparison(date1: now, date2: now)
// date1 <= date2, date1 >= date2, date1 == date2
ab Swift 3 und höher, Date is Comparable So können wir Datumsangaben direkt vergleichen
let date1 = Date()
let date2 = Date()
let isGreater = date1 > date2
print(isGreater)
let isSmaller = date1 < date2
print(isSmaller)
let isEqual = date1 == date2
print(isEqual)
Alternativ können wir eine Erweiterung am Date erstellen
extension Date {
func isEqualTo(_ date: Date) -> Bool {
return self == date
}
func isGreaterThan(_ date: Date) -> Bool {
return self > date
}
func isSmallerThan(_ date: Date) -> Bool {
return self < date
}
}
Verwenden Sie: let isEqual = date1.isEqualTo(date2)
Schau dir das an http://iswift.org/cookbook/compare-2-dates
Termine erhalten:
// Get current date
let dateA = NSDate()
// Get a later date (after a couple of milliseconds)
let dateB = NSDate()
Verwendung der SWITCH-Anweisung
// Compare them
switch dateA.compare(dateB) {
case .OrderedAscending : print("Date A is earlier than date B")
case .OrderedDescending : print("Date A is later than date B")
case .OrderedSame : print("The two dates are the same")
}
mit IF-Anweisung
if datePickerTo.date.compare(datePicker.date) == .orderedAscending {
datePickerTo.date = datePicker.date
}
Für mich bestand das Problem darin, dass ich meine eigene Erweiterung der Date-Klasse hatte, die alle Vergleichsoperatoren definierte. Jetzt (seit Swift 3) ist dieses Datum vergleichbar, diese Erweiterungen werden nicht benötigt. Also habe ich sie kommentiert und es hat funktioniert.
Swift 3: Weiß nicht, ob Sie danach suchen. Aber ich vergleiche einen String mit einem aktuellen Zeitstempel, um zu sehen, ob mein String älter ist.
func checkTimeStamp(date: String!) -> Bool {
let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier:"en_US_POSIX")
let datecomponents = dateFormatter.date(from: date)
let now = Date()
if (datecomponents! >= now) {
return true
} else {
return false
}
}
Um es zu benutzen:
if (checkTimeStamp(date:"2016-11-21 12:00:00") == false) {
// Do something
}
Datum nur mit Jahr - Monat - Tag und ohne Zeit für mich zu vergleichen, funktionierte so:
let order = Calendar.current.compare(self.startDate, to: compareDate!, toGranularity: .day)
switch order {
case .orderedAscending:
print("\(gpsDate) is after \(self.startDate)")
case .orderedDescending:
print("\(gpsDate) is before \(self.startDate)")
default:
print("\(gpsDate) is the same as \(self.startDate)")
}
Swift 5:
1) Wenn Sie Datumstyp verwenden:
let firstDate = Date()
let secondDate = Date()
print(firstDate > secondDate)
print(firstDate < secondDate)
print(firstDate == secondDate)
2) Wenn Sie den String-Typ verwenden:
let firstStringDate = "2019-05-22T09:56:00.1111111"
let secondStringDate = "2019-05-22T09:56:00.2222222"
print(firstStringDate > secondStringDate) // false
print(firstStringDate < secondStringDate) // true
print(firstStringDate == secondStringDate) // false
Ich bin mir nicht sicher oder die zweite Option funktioniert zu 100%. Aber um wie viel würde ich die Werte von firstStringDate und secondStringDate nicht ändern, das Ergebnis war korrekt.
extension Date {
func isBetween(_ date1: Date, and date2: Date) -> Bool {
return (min(date1, date2) ... max(date1, date2)).contains(self)
}
}
let resultArray = dateArray.filter { $0.dateObj!.isBetween(startDate, and: endDate) }
Zum Zeitpunkt dieses Schreibens unterstützt Swift das Vergleichen von Daten mit allen Vergleichsoperatoren (d. H. <
, <=
, ==
, >=
und >
). Sie können auch optionale Datumsangaben vergleichen, sind jedoch auf <
, ==
und >
beschränkt. Wenn Sie zwei optionale Datumsangaben mit <=
oder >=
vergleichen möchten, d. H.
let date1: Date? = ...
let date2: Date? = ...
if date1 >= date2 { ... }
Sie können die Operatoren <=
und >=
zur Unterstützung von Optionals überladen:
func <= <T: Comparable>(lhs: T?, rhs: T?) -> Bool {
return lhs == rhs || lhs < rhs
}
func >= <T: Comparable>(lhs: T?, rhs: T?) -> Bool {
return lhs == rhs || lhs > rhs
}
Ein anderer Weg, es zu tun:
switch date1.compare(date2) {
case .orderedAscending:
break
case .orderedDescending:
break;
case .orderedSame:
break
}
var strDateValidate = ""
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let firstDate = dateFormatter.date(from:lblStartTime.text!)
let secondDate = dateFormatter.date(from:lblEndTime.text!)
if firstDate?.compare(secondDate!) == .orderedSame || firstDate?.compare(secondDate!) == .orderedAscending {
print("Both dates are same or first is less than scecond")
strDateValidate = "yes"
}
else
{
//second date is bigger than first
strDateValidate = "no"
}
if strDateValidate == "no"
{
alertView(message: "Start date and end date for a booking must be equal or Start date must be smaller than the end date", controller: self)
}