Estoy actualizando mi app para Swift 3.0 sintaxis (sé que aún está en beta, pero quiero estar preparado tan pronto como se suelta).

Hasta que la anterior Beta de Xcode (Beta 5) yo era capaz de comparar dos Date de los objetos utilizando los operandos <, > y ==. Pero en la última versión beta (Beta 6) esto no funciona más. Aquí hay algunas capturas de pantalla:

Swift 3 - Comparación de objetos de Fecha
Swift 3 - Comparación de objetos de Fecha

Como se puede ver en las capturas de pantalla, estos son dos Date objetos. Pero me sale el siguiente error:
Swift 3 - Comparación de objetos de Fecha

¿Qué estoy haciendo mal? Las funciones se declaró en la Date clase:

static func >(Date, Date)

Devuelve true si la mano izquierda la Fecha es posterior en el tiempo que la mano derecha la Fecha.

Es sólo una Beta bug o estoy haciendo algo mal?

  • let d1 = Date() ; let d2 = Date() ; if d1 > d2 { } funciona en mi Xcode 8 beta 6.
  • Xcode 8.0 Beta 6?
  • Sí. – Usted debe de buscar el mensaje de error completa en el Informe navegador.
  • Gracias @MartinR! No sé que puedo «inmersión» en un error y obtener más información. Me ha ayudado mucho!
  • aceptar la respuesta correcta
InformationsquelleAutor beeef | 2016-08-18

12 Comentarios

  1. 142

    He probado este fragmento de código (en XCode 8 Beta 6), y se está trabajando muy bien.

    let date1 = Date()
    let date2 = Date().addingTimeInterval(100)
    
    if date1 == date2 { ... }
    else if date1 > date2 { ... }
    else if date1 < date2 { ... }
    • si me quieren hacer caso del tiempo. por ejemplo, 2019-05-14 12:08:14 +0000 = = 2019-05-14 debe devolver true. entonces, ¿qué ?
    • Si quieres comparar fechas sin tomar una DateComponent en cuenta. Usted necesita para obtener los componentes que desea a partir de la fecha. A continuación, obtener la fecha de DateComponents y comparar entre ellos.
  2. 47

    Date es Comparable & Equatable (como la de Swift 3)

    Esta respuesta complementa @Ankit Thakur la respuesta.

    Desde Swift 3 el Date struct (en función del subyacente NSDate clase) adopta la Comparable y Equatable protocolos.

    • Comparable requiere que Date implementar los operadores: <, <=, >, >=.
    • Equatable requiere que Date implementar el == operador.
    • Equatable permite Date para usar la configuración predeterminada de la aplicación de la != operador (que es la inversa de la Equatable == operador de la aplicación).

    El siguiente ejemplo de código ejercicios de estos operadores de comparación y confirma que las comparaciones son verdaderas con print declaraciones.

    Función de comparación

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

    Ejemplo De Uso

    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
  3. 28

    de Swift 3 y por encima de, la Fecha es Comparable así podemos comparar directamente como fechas de

    let date1 = Date()
    let date2 = Date()
    
    let isGreater = date1 > date2
    print(isGreater)
    
    let isSmaller = date1 < date2
    print(isSmaller)
    
    let isEqual = date1 == date2
    print(isEqual)

    Alternativamente, podemos crear la extensión en la Fecha de

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

    Uso: let isEqual = date1.isEqualTo(date2)

    • si me quieren hacer caso del tiempo. por ejemplo, 2019-05-14 12:08:14 +0000 = = 2019-05-14 debe devolver true. entonces, ¿qué ?
  4. 14

    Mira este
    http://iswift.org/cookbook/compare-2-dates

    Obtener Fechas:

    //Get current date
    let dateA = NSDate()
    
    //Get a later date (after a couple of milliseconds)
    let dateB = NSDate()

    Mediante sentencia SWITCH

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

    el uso de la Instrucción IF

     if dateA.compare(dateB) == .orderedAscending {
         datePickerTo.date = datePicker.date
     }
    
     //OR
    
     if case .orderedAcending = dateA.compare(dateB) {
    
     }
  5. 9

    Para mí, el problema era que yo tenía mi propia extensión a la Fecha de la clase que era la definición de comparar todos los operadores. Ahora (desde swift 3) que la Fecha es comparable, estas extensiones no son necesarios. Así que me comentó y funcionó.

  6. 6

    SWIFT 3: no sé si esto es lo que estás buscando. Pero puedo comparar una cadena a una marca de tiempo actual para ver si mi cadena es mayor que ahora.

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

    A utilizar:

    if (checkTimeStamp(date:"2016-11-21 12:00:00") == false) {
        //Do something
    }
  7. 5

    Para comparar la fecha sólo con año – mes – día y sin tiempo para mí funcionó como este:

         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)")
                            }
  8. 1

    Al momento de escribir este artículo, Swift soporta de forma nativa la comparación de Fechas con todos los operadores de comparación (es decir,<, <=, ==, >=, y >). También puedes comparar opcional Fechas, sino que se limitan a <, ==, y >. Si usted necesita comparar dos opcionales fechas con <= o >=, es decir,

    let date1: Date? = ...
    let date2: Date? = ...
    if date1 >= date2 { ... }

    Puede sobrecargar el <= y >=a los operadores de apoyo opcionales:

    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
    }
  9. 1
    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) }
  10. 1

    Otra manera de hacerlo:

        switch date1.compare(date2) {
            case .orderedAscending:
                break
    
            case .orderedDescending:
                break;
    
            case .orderedSame:
                break
        }
  11. 1
       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)
                }
  12. 0

    Swift 5:

    1) Si utiliza el tipo de Fecha:

    let firstDate  = Date()
    let secondDate = Date()
    
    print(firstDate > secondDate)  
    print(firstDate < secondDate)
    print(firstDate == secondDate)

    2) Si utiliza el tipo de Cadena:

    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 

    No estoy seguro de que ni la segunda opción funciona al 100%. Pero, ¿cuánto me podría no cambiar los valores de firstStringDate y secondStringDate el resultado fue correcto.

Dejar respuesta

Please enter your comment!
Please enter your name here