it-swarm.com.de

Swift 3 - Vergleichen von Datumsobjekten

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:

 enter image description here  enter image description here

Wie Sie in beiden Screenshots sehen können, handelt es sich um zwei Date Objekte. Aber ich bekomme folgenden Fehler:  enter image description here

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?

67
beeef

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 { ... }
128
Ankit Thakur

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: <, <=, >, >=.
  • Für 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.

Vergleichsfunktion

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: ",  ")
}

Verwendungsbeispiel

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
42
Mobile Dan

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)

24
Suhit Patil

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

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.

9

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
}
6
N.B

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.

1
maxwell
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) }
1
Arjun Patel

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
}
1
NSExceptional

Ein anderer Weg, es zu tun:

    switch date1.compare(date2) {
        case .orderedAscending:
            break

        case .orderedDescending:
            break;

        case .orderedSame:
            break
    }
0
Shadros
   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)
            }
0