Cómo obtener la hora actual en Swift: 5 errores fatales y su solución

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

El tiempo no son solo números: por qué incluso los desarrolladores experimentados se equivocan

\n\n

Cada desarrollador de iOS se ha enfrentado al menos una vez a la tarea: «solo necesito obtener la hora actual». Parece algo sencillo, ¿verdad? Pero es aquí, donde menos se espera, donde los principiantes (y no solo ellos) cometen errores que luego se convierten en bugs, caídas de aplicaciones y usuarios insatisfechos.

\n\n

En este artículo analizaremos los cinco errores más comunes al trabajar con la hora actual en Swift, que han acumulado miles de visitas en Stack Overflow. Aprenderá cómo evitarlos y escribir código limpio y fiable.

\n\n
«Solo quiero obtener la hora actual como datetime en Swift, pero obtengo nil o algo que no esperaba. ¡Ayuda!» — el típico grito de auxilio en los foros.
\n\n

Averigüemos qué está fallando.

\n\n

1. Error con DateFormatter: la locale es la principal enemiga

\n\n

Problema

\n

La consulta más popular: «Swift get current time as datetime string». El desarrollador escribe:

\n\n
let dateFormatter = DateFormatter()\ndateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\nlet currentTime = dateFormatter.string(from: Date())\nprint(currentTime) // ¿Funciona? No del todo
\n\n

En el simulador o en un dispositivo con locale en inglés funciona perfectamente. Pero cuando el usuario selecciona, por ejemplo, alemán o ruso en la configuración, obtiene nil o un formato inesperado.

\n\n

¿Por qué sucede esto?

\n

Por defecto, DateFormatter usa la locale actual del dispositivo. Para formatos de fecha fijos que se analizan o muestran en una API, esto es un desastre.

\n\n

Solución

\n

Siempre establezca la locale en_US_POSIX para formatos que no están destinados a mostrarse al usuario:

\n\n
let dateFormatter = DateFormatter()\ndateFormatter.locale = Locale(identifier: "en_US_POSIX")\ndateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\ndateFormatter.timeZone = TimeZone.current // ¡No olvidemos la zona horaria!\nlet currentTime = dateFormatter.string(from: Date())\nprint(currentTime) // "2024-12-25 14:30:00" — estable
\n\n
Recuerde: en_US_POSIX es su mejor amigo al trabajar con formatos de fecha fijos en Swift.
\n\n

2. Ignorar la zona horaria (TimeZone)

\n\n

Problema

\n

Obtuvo una cadena con la hora actual. Pero, ¿qué hora obtuvo realmente? ¿Hora local? ¿UTC? ¿Del servidor? El error ocurre cuando el desarrollador no especifica timeZone en DateFormatter.

\n\n

Ejemplo de error:

\n
let formatter = DateFormatter()\nformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"\nlet now = formatter.string(from: Date())\n// Resultado: "2024-12-25T14:30:00+0300" — es la hora local con offset\n// ¿Pero qué pasa si siempre necesita UTC?
\n\n

Solución

\n

Siempre especifique explícitamente TimeZone:

\n\n
// Para trabajar con el servidor (UTC)\nlet utcFormatter = DateFormatter()\nutcFormatter.timeZone = TimeZone(abbreviation: "UTC")\nutcFormatter.locale = Locale(identifier: "en_US_POSIX")\nutcFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"\nlet utcTime = utcFormatter.string(from: Date())\nprint(utcTime) // "2024-12-25T11:30:00Z"\n\n// Para mostrar al usuario (su hora local)\nlet localFormatter = DateFormatter()\nlocalFormatter.timeZone = TimeZone.current\nlocalFormatter.dateStyle = .medium\nlocalFormatter.timeStyle = .short\nlet localTime = localFormatter.string(from: Date())\nprint(localTime) // "25 dic 2024, 14:30"
\n\n

3. Usar Date() para comparaciones: trampas ocultas

\n\n

Problema

\n

Muchos piensan que Date() devuelve el mismo valor dentro de una misma llamada. Pero no es así. Swift Date es una instantánea del tiempo. Si llama a Date() dos veces en el código, los valores pueden diferir en microsegundos.

\n\n


                
                

Blogs

Book Recommendations