Trabajo con fechas y horas en Swift: técnicas avanzadas

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

Trabajo avanzado con fechas y horas en Swift



Trabajar con fechas y horas es una de las tareas clave en el desarrollo de iOS/macOS. A nivel básico, la mayoría de los desarrolladores están familiarizados con Date, DateFormatter y Calendar. Sin embargo, a nivel avanzado surgen escenarios complejos: manejo de zonas horarias, alto rendimiento al analizar cientos de fechas, visualización correcta del tiempo relativo y procesamiento de formatos personalizados. En este artículo, analizaremos técnicas avanzadas para trabajar con fechas en Swift que le ayudarán a escribir código más robusto y eficiente.



1. Optimización del análisis de fechas: DateFormatter vs ISO8601DateFormatter



Una de las operaciones más comunes es convertir una cadena en una fecha. El DateFormatter estándar es conveniente, pero su creación es una operación costosa. Si analiza cientos de fechas en un bucle, cada llamada a DateFormatter() crea un nuevo objeto, lo que provoca una caída en el rendimiento.



Problema: Crear DateFormatter en un bucle

// ❌ Mal: creamos el formateador en un buclefor dateString in dateStrings {    let formatter = DateFormatter()    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"    if let date = formatter.date(from: dateString) {        // procesamiento    }}


Solución: Caché e ISO8601DateFormatter

Para el formato ISO 8601, use ISO8601DateFormatter — es más rápido y seguro para subprocesos. Para formatos personalizados, cree el formateador una vez y reutilícelo.



// ✅ Bien: almacenamos en caché el formateadorprivate let isoFormatter: ISO8601DateFormatter = {    let formatter = ISO8601DateFormatter()    formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]    return formatter}()

// Para formatos personalizadosprivate let customFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "dd.MM.yyyy HH:mm" formatter.locale = Locale(identifier: "es_ES") formatter.timeZone = TimeZone(secondsFromGMT: 0) return formatter}()

func parseDates(_ strings: [String]) -> [Date] { return strings.compactMap { isoFormatter.date(from: $0) }}


Importante: DateFormatter no es seguro para subprocesos. Si trabaja con múltiples subprocesos, use Thread.current o cree un formateador separado para cada subproceso.



2. Trabajo con zonas horarias y DateComponents



El trabajo avanzado con fechas requiere tener en cuenta las zonas horarias. Date en Swift es un momento absoluto en el tiempo (número de segundos desde el 1 de enero de 2001). Toda la información sobre la zona horaria reside en Calendar y DateFormatter.



Extraer componentes de fecha en una zona horaria específica

let date = Date()let calendar = Calendar.currentlet timeZone = TimeZone(identifier: "America/New_York")!

// Obtenemos componentes para la zona horaria especificadavar components = calendar.dateComponents(in: timeZone, from: date)components.hour // hora en Nueva Yorkcomponents.day // día en Nueva York

// Crear una fecha a partir de componentes con timeZone explícitovar newComponents = DateComponents()newComponents.year = 2024newComponents.month = 12newComponents.day = 25newComponents.hour = 10newComponents.minute = 30newComponents.timeZone = TimeZone(identifier: "Europe/Madrid")

let christmasDate = calendar.date(from: newComponents)print(christmasDate!) // 2024-12-25 09:30:00 +0000 (UTC)


Comparar fechas teniendo en cuenta el calendario

Use compare(_:to:toGranularity:) para comparar con precisión de día, hora o minuto:



let date1 = Date()let date2 = Date().addingTimeInterval(3600) // +1 hora

let result = calendar.compare(date1, to: date2, toGranularity: .hour)// .orderedSame, si están en la misma hora// .orderedAscending, si date1 es anterior


<

Blogs

Book Recommendations