La date de DateFormatter de la cadena devuelve cero.

Por alguna razón, algunos dispositivos no pueden convertir una cadena a una date.

Este es mi código de conversión de date:

func dateFromString(string: String) -> Date? { let f = DateFormatter.init() f.dateFormat = "yyyy-MM-dd HH:mm:ss" return f.date(from: string) } 

Ahora, a través de mi plataforma analítica capturo cuando este retorno no es válido. No tengo ni idea de por qué. Supongo que tiene algo que ver con local y tal vez la configuration de zona horaria o 12 / 24h, pero no puedo determinar cuál es el problema.

Más detalles…

He rastreado la siguiente configuration que causa una devolución nula:

zona horaria – Asia / Mascate

local – es_GB

cadena – "2016-12-18 08:31:43"

Pero cuando ejecuto esto en el patio de juegos obtengo una date válida:

 let f = DateFormatter.init() f.dateFormat = "yyyy-MM-dd HH:mm:ss" f.locale = Locale.init(identifier: "en_GB") f.timeZone = TimeZone.init(identifier: "Asia/Muscat") let s = f.date(from: "2016-12-18 08:31:43") 

"18 de diciembre de 2016, 6:31 a.m."

¿Qué hace que DateFromatter no devuelva nada?

Si está mostrando su date para el usuario, no establezca una cadena de formatting de date fija . Si está usando dates de formatting fijo, primero arregle su localidad .

Para get más información, consulte las preguntas y respuestas técnicas QA1480 tituladas "NSDateFormatter and Internet Dates". A continuación se presentan extractos relevantes (formateo mío):

P: Estoy usando NSDateFormatter para analizar una date de estilo de Internet, pero esto falla para algunos usuarios en algunas regiones. He establecido una cadena de formatting de date específica; ¿No debería forzar a NSDateFormatter a funcionar independientemente de la configuration regional de los usuarios?

R: No. Mientras que la configuration de una cadena de formatting de date parece funcionar para la mayoría de los usuarios, no es la solución correcta a este problema. Hay muchos lugares donde las cadenas de formatting se comportan de maneras inesperadas. (…)

Si está trabajando con dates visibles para el usuario, debe evitar establecer una cadena de formatting de date fija porque es muy difícil pnetworkingecir cómo se expressá su cadena de formatting en todas las configuraciones de usuario posibles. Más bien, debe limitarse a establecer styles de date y hora (a través de NSDateFormatter.dateStyle y NSDateFormatter.timeStyle ) o generar su cadena de formatting de date desde una plantilla (utilizando NSDateFormatter.setLocalizedDateFormatFromTemplate(String) ).

Por otro lado, si está trabajando con dates de formatting fijo, primero debe establecer la configuration regional del formateador de date en algo apropiado para su formatting fijo. En la mayoría de los casos, la mejor opción para elegir es "en_US_POSIX", un entorno local específicamente diseñado para get resultados en inglés de EE. UU. Independientemente de las preferences del usuario y del sistema.