Trabajo con fechas en Swift (iOS/macOS): reseña de bibliotecas y herramientas
En el ecosistema de Apple, el trabajo con fechas y horas se implementa tradicionalmente a través del framework Foundation. Sin embargo, para escenarios complejos (análisis de formatos no estándar, trabajo con fechas relativas, manipulaciones en diferentes zonas horarias), los desarrolladores suelen recurrir a bibliotecas de terceros. En este artículo, revisaremos tanto las capacidades integradas de Swift como las herramientas populares para el procesamiento de fechas.
1. Herramientas integradas de Foundation (Date, DateFormatter, Calendar)
El tipo básico para trabajar con fechas es la estructura Date. Representa un momento absoluto en el tiempo (número de segundos desde el 1 de enero de 2001). Para el formateo se utiliza DateFormatter, y para los cálculos de calendario, Calendar.
import Foundation
// Obtención de la fecha actuallet now = Date()print("Fecha actual: \\(now)")
// Formateo de fechalet formatter = DateFormatter()formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"formatter.timeZone = TimeZone(identifier: "Europe/Moscow")let formattedDate = formatter.string(from: now)print("Fecha formateada: \\(formattedDate)")
// Análisis de cadena a fechalet dateString = "2025-03-15 14:30:00"if let parsedDate = formatter.date(from: dateString) { print("Fecha analizada: \\(parsedDate)")}
// Cálculos de calendariolet calendar = Calendar.currentlet tomorrow = calendar.date(byAdding: .day, value: 1, to: now)!print("Mañana: \\(tomorrow)")2. SwiftDate — potente biblioteca para trabajar con fechas
SwiftDate es la biblioteca de terceros más popular para Swift. Amplía las capacidades de Foundation, añadiendo:
- Sintaxis conveniente para crear fechas (por ejemplo,
DateInRegion) - Trabajo con fechas relativas ("hace 2 horas", "dentro de 3 días")
- Soporte para todas las zonas horarias y calendarios
- Análisis de cadenas en cualquier formato
import SwiftDate
// Creación de fecha en una regiónlet region = Region(calendar: Calendars.gregorian, zone: Zones.europeMoscow, locale: Locales.russian)let date = DateInRegion("2025-03-15 14:30:00", format: "yyyy-MM-dd HH:mm:ss", region: region)!print("Fecha en la región: \\(date)")
// Tiempo relativolet now = DateInRegion()let twoHoursAgo = now - 2.hoursprint("Hace 2 horas: \\(twoHoursAgo.toRelative())") // "hace 2 horas"
// Diferencia entre fechaslet later = now + 5.dayslet difference = later - nowprint("Diferencia: \\(difference.days) días")
// Conversión a otra zona horarialet newYorkRegion = Region(zone: Zones.americaNewYork)let dateInNY = date.convert(to: newYorkRegion)print("En Nueva York: \\(dateInNY)")3. TimeInterval y trabajo con intervalos de tiempo
TimeInterval es un tipo de dato en Swift que representa un número de segundos. Se utiliza a menudo para medir intervalos de tiempo y retrasos.
import Foundation
// Creación de un intervalolet oneHour: TimeInterval = 3600let twoDays: TimeInterval = 2 * 24 * 3600
// Medición del tiempo de ejecuciónlet start = Date()// Simulación de una operación largasleep(2)let end = Date()let elapsed = end.timeIntervalSince(start)print("Han pasado \\(elapsed) segundos")
// Uso con DispatchQueueDispatchQueue.main.asyncAfter(deadline: .now() + oneHour) { print("Ha pasado una hora")}4. ISO8601DateFormatter — trabajo con formatos internacionales
Para trabajar con fechas en formato ISO 8601 (usado a menudo en APIs), Apple proporciona la clase especializada ISO8601DateFormatter.
import Foundation
let isoFormatter = ISO8601DateFormatter()isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
// Análisis de cadena ISOlet isoString = "2025-03-15T14:30:00.000Z"if let date = También en la biblioteca
Autorización y autenticación en C++: bibliotecas, ejemplos e implementación
Monitoreo de aplicaciones .NET con Prometheus y OpenTelemetry
Detekt para Kotlin: guía completa con ejemplos prácticos