ios - from - nsdate swift
El 1 de abril, las fechas de los 80 no se pudieron analizar en iOS 10.0 (1)
Este problema ocurre si el horario de verano comienza exactamente a la medianoche , como fue el caso de Moscú en los años 1981–1984 (ver, por ejemplo, Cambios de reloj en Moscú, Rusia (Moskva) ).
Esto también se observó en
- ¿Por qué NSDateFormatter devuelve una fecha nula para estas 4 zonas horarias? y
- ¿Por qué NSDateFormatter está volviendo nulo para un 19/10/2014 en una zona horaria brasileña?
Por ejemplo, a la medianoche del 1 de abril de 1984, los relojes se ajustaron una hora hacia adelante, lo que significa que la fecha "1984-04-01 00:00" no existe en esa zona horaria:
let dFmt = DateFormatter()
dFmt.dateFormat = "yyyy-MM-dd"
dFmt.timeZone = TimeZone(identifier: "Europe/Moscow")
print(dFmt.date(from: "1984-04-01")) // nil
Como solución, puede decirle al formateador de fecha que sea "indulgente":
dFmt.isLenient = true
y luego devolverá la primera fecha válida en ese día:
dFmt.isLenient = true
if let date = dFmt.date(from: "1984-04-01") {
dFmt.dateFormat = "yyyy-MM-dd HH:mm:ss"
print(dFmt.string(from: date))
}
// 1984-04-01 01:00:00
Rob Mayoff dio una solución diferente , que consiste en hacer que el formateador de la fecha use el mediodía en lugar de la medianoche como la fecha predeterminada. Aquí hay una traducción del código de rob de Objective-C a Swift:
let noon = DateComponents(calendar: dFmt.calendar, timeZone: dFmt.timeZone,
year: 2001, month: 1, day: 1, hour: 12, minute: 0, second: 0)
dFmt.defaultDate = noon.date
if let date = dFmt.date(from: "1984-04-01") {
dFmt.dateFormat = "yyyy-MM-dd HH:mm:ss"
print(dFmt.string(from: date))
}
// 1984-04-01 12:00:00
Descubrí que el método DateFormatter
date(from:)
no puede analizar un par de fechas específicas.
El método devuelve
nil
para el 1 de abril de 1981-1984 años.
¿Es un error de la Fundación?
¿Qué podemos hacer para analizar estas fechas?
Xcode 8.0, iOS SDK 10.0. Aquí hay una captura de pantalla de un breve ejemplo de patio de recreo: