Cómo agregar 1 día a NSDate: 5 errores fatales de principiante en Swift

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

Introducción: ¿por qué tu código con fechas funciona "a veces"?

\n\n

Imagina: estás escribiendo una aplicación de calendario o un recordatorio. Necesitas simplemente tomar la fecha actual y agregarle un día. Parece sencillo, ¿qué podría salir mal? Abres Stack Overflow, encuentras una pregunta con miles de visitas "How do I add 1 day to an NSDate?" — y te das cuenta de que incluso una operación tan simple puede convertirse en una pesadilla.

\n\n

En este artículo analizaremos los principales errores al agregar un día a NSDate en Swift, aprenderemos a evitarlos y escribiremos un código correcto y confiable. Descubrirás por qué el enfoque antiguo con NSDate y timeInterval es un camino hacia errores, y cómo las API modernas de Apple solucionan la situación.

\n\n

¡Vamos a entender las fechas de una vez por todas!

\n\n

Error n.º 1: Usar timeInterval para agregar un día

\n\n

Código catastrófico

\n

El error más común en el que caen los principiantes:

\n\n
let today = NSDate()\nlet oneDay: TimeInterval = 24 * 60 * 60 // 86,400 segundos\nlet tomorrow = today.addingTimeInterval(oneDay)
\n\n

A primera vista, parece lógico. Un día tiene 24 horas, una hora 60 minutos, un minuto 60 segundos. Multiplicamos, sumamos — ¡listo!

\n\n

Pero no. Esto funciona solo en el 99% de los casos, y en el 1% restante arruina toda la aplicación para los usuarios. ¿Por qué?

\n\n

Trampas ocultas

\n
    \n
  • Cambio de horario de verano/invierno. En el día del cambio de hora, un día puede durar 23 o 25 horas. Tus 86,400 segundos se convertirán en 83,400 o 90,000.
  • \n
  • Segundos intercalares. Aunque es un caso raro, existen oficialmente.
  • \n
  • Zonas horarias. Si el usuario viaja, su hora local puede desajustarse.
  • \n
  • Precisión al segundo. No solo estás agregando "el día siguiente", sino exactamente 24 horas — son cosas diferentes.
  • \n
\n\n

¿Quieres un ejemplo? El 28 de marzo de 2021 en Ucrania, los relojes se adelantaron una hora a las 3:00 a. m. Si agregaste timeInterval a las 2:30 a. m., no obtendrás las 3:30, sino... ¿las 4:30? ¿O las 2:30? Depende de cómo el sistema maneje el cambio. En resumen, caos.

\n\n

Error n.º 2: Mezclar NSDate y Date en un mismo proyecto

\n\n

En Swift hay dos tipos de fechas: el antiguo NSDate (de Objective-C) y el moderno Date (nativo de Swift). Muchos desarrolladores, especialmente aquellos que leen tutoriales antiguos o respuestas de Stack Overflow de 2014, siguen usando NSDate.

\n\n

El problema es que NSDate es una clase (tipo por referencia), mientras que Date es una estructura (tipo por valor). Mezclarlos en el código lleva a:

\n
    \n
  • Errores no evidentes con mutabilidad
  • \n
  • Conversiones innecesarias (as Date, as NSDate)
  • \n
  • Confusión en las API
  • \n
\n\n

Regla: en código Swift nuevo, usa solo Date. Deja NSDate para la compatibilidad con bibliotecas de Objective-C.

\n\n

Error n.º 3: Ignorar Calendar y TimeZone

\n\n

Cuando agregas "1 día" a una fecha, lo haces en el contexto de un calendario. Sin especificar un calendario, el sistema usa Calendar.current — el calendario del usuario (generalmente gregoriano).

\n\n

Pero, ¿qué pasa si el usuario de Arabia Saudita usa el calendario islámico? ¿O el japonés? Sin especificar explícitamente el calendario, corres el riesgo de obtener resultados inesperados.

\n\n

Ejemplo de código incorrecto

\n
var dateComponents = DateComponents()\ndateComponents.day = 1\nlet tomorrow = Calendar.current.date(byAdding: dateComponents, to: Date())
\n\n

Este código es casi correcto, pero usa implícitamente la zona horaria del dispositivo. Si trabajas con fechas de servidor en UTC y el usuario está en Moscú (UTC+3), el "mañana" podría llegar 3 horas antes.

\n\n

Solución correcta: Calendar + DateComponents

\n\n

El estándar de oro para agregar un día

\n

Así es como se agrega correctamente 1 día a

Blogs

Book Recommendations