El tiempo no son solo números: por qué incluso los desarrolladores experimentados se equivocan
\n\nCada 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\nEn 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\n1. Error con DateFormatter: la locale es la principal enemiga
\n\nProblema
\nLa consulta más popular: «Swift get current time as datetime string». El desarrollador escribe:
\n\nlet dateFormatter = DateFormatter()\ndateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\nlet currentTime = dateFormatter.string(from: Date())\nprint(currentTime) // ¿Funciona? No del todo\n\nEn 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.
¿Por qué sucede esto?
\nPor 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.
Solución
\nSiempre establezca la locale en_US_POSIX para formatos que no están destinados a mostrarse al usuario:
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\nRecuerde: 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\nProblema
\nObtuvo 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.
Ejemplo de error:
\nlet 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\nSolución
\nSiempre 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\n3. Usar Date() para comparaciones: trampas ocultas
\n\nProblema
\nMuchos 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.
Blogs
Book Recommendations
Leer también
WebSocket en Swift: tiempo real para iOS y macOS
Generics en Go: para qué sirven y cómo usarlos para principiantes
Sesión PHP expira en 30 minutos: 3 métodos efectivos + código
Code review en Swift: qué verificar y cómo dar retroalimentación
Cómo convertir una cadena a enum en TypeScript: tutorial completo