online from dateformat ios swift nsdateformatter foundation

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