Quiero convertir dateStartString = “28/02/2018” a Date y comparar esa fecha convertida con la fecha de hoy. cuando convierto dateStartString la fecha convertida es "2018-02-27 18:30:00 UTC". ¿Por qué su salida es una fecha incorrecta?

aquí está mi código

var dateStartString = "28/02/2018"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
guard let dateStartDate = dateFormatter.date(from: dateStartString) else {
    fatalError("ERROR: Date conversion failed due to mismatched format.")
}

let dateToday = Date()

if(dateStartDate>=dateToday){
    print("Yes")
}
else{
    print("Today date is 28/02/2018. Why it print No?")
}

Espero que entiendas mi problema. Gracias por adelantado.

2
John 28 feb. 2018 a las 10:08

4 respuestas

La mejor respuesta

Debe comprender que Date no solo representa una fecha, sino también una hora .

>= compara los componentes de fecha y hora de un objeto Date. Como no especificó ninguna hora en su cadena de fecha, la API asumió que eran las 00:00:00 en su hora local, que son las 18:30:00 del día anterior en UTC. ¿Por qué UTC, preguntas? Ese es siempre el description de la fecha. Cuando imprime una fecha, siempre la imprime en hora UTC. Para imprimirlo en su zona horaria, configure la propiedad timeZone de su formateador de fecha y formatee.

Una forma de comparar solo los componentes de fecha es eliminando los componentes de tiempo. De esta respuesta, esta es Cómo eliminar los componentes de tiempo:

public func removeTimeStamp(fromDate: Date) -> Date {
    guard let date = Calendar.current.date(from: Calendar.current.dateComponents([.year, .month, .day], from: fromDate)) else {
        fatalError("Failed to strip time from Date object")
    }
    return date
}

Ahora esto debería ser cierto:

dateStartDate >= removeTimeStamp(fromDate: dateToday)
2
Sweeper 28 feb. 2018 a las 07:18

Como Sweeper explicó, dateStartDate está en 00:00 de 28/02/2018, mientras que dateToday es el punto actual en el tiempo, que es el mismo día, pero después de la medianoche. Por lo tanto, dateStartDate >= dateToday se evalúa como false.

Para comparar las marcas de tiempo solo con la granularidad del día e ignorar los componentes de tiempo que puede usar

if Calendar.current.compare(dateStartDate, to: dateToday, toGranularity: .day) != .orderedAscending {
    print("Yes")
}

Esto imprimirá "Sí" si dateStartDate está en el mismo o más tarde día que dateToday.

El método de comparación devuelve .orderedAscending, .orderedSame, o .orderedDescending, dependiendo de si la primera fecha es el un día anterior, el mismo día o un día posterior a la segunda fecha.

1
Martin R 28 feb. 2018 a las 08:19

Intente establecer su dateFormatter actual mientras compara la fecha. Debajo de su actualización de código de muestra:

var dateStartString = "28/02/2018"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
dateFormatter.locale = NSLocale.current
guard let dateStartDate = dateFormatter.date(from: dateStartString) else {
    fatalError("ERROR: Date conversion failed due to mismatched format.")
}

var dateToday = Date()
print(dateToday)
let dateTodaystr = dateFormatter.string(from: dateToday)
dateToday = dateFormatter.date(from: dateTodaystr)!
print(dateToday)

if(dateStartDate>=dateToday){
    print("Yes")
}
else{
    print("Today date is 28/02/2018. Why it print No?")
}
0
MAhipal Singh 28 feb. 2018 a las 08:07

Necesita timeZone para su dateFormatter:

dateFormatter.timeZone = TimeZone(secondsFromGMT:0)!
-1
Moayad Al kouz 28 feb. 2018 a las 07:36