Métodos Set: Modificar Fechas en JavaScript
Aprende a modificar componentes individuales de fechas usando los métodos set. Domina el ajuste automático de fechas y la diferencia entre métodos locales y UTC.
TL;DR - Resumen rápido
- Los métodos set mutan el objeto original: crea copias con new Date(fecha) antes de modificar
- setMonth(13) ajusta automáticamente a enero del año siguiente (útil para cálculos)
- setYear() está obsoleto y causa bugs Y2K: usa siempre setFullYear()
- setMilliseconds() modifica 0-999 ms, setTime() reemplaza el timestamp completo
- Métodos set devuelven el timestamp modificado, permitiendo encadenar operaciones
Introducción a los Métodos Set
Los métodos set modifican objetos Date in-place, alterando el objeto original en lugar de devolver uno nuevo. Esta mutabilidad es crítica de entender: si pasas un objeto Date a una función que usa métodos set, el objeto original quedará modificado fuera de la función. Este comportamiento es diferente a tipos inmutables como strings o números, y causa bugs sutiles en código que asume que los objetos Date no cambian.
JavaScript ofrece métodos set para cada componente: setFullYear(), setMonth(), setDate(), setHours(), setMinutes(), setSeconds(), setMilliseconds() y setTime(). Todos vienen con variantes UTC (setUTCFullYear(), etc.) para manipular fechas en tiempo universal. El superpoder de estos métodos: ajuste automático de valores fuera de rango. setDate(32) no causa error, ajusta automáticamente al día 1 del mes siguiente. Esto simplifica cálculos pero también puede ocultar errores.
- setFullYear() y setUTCFullYear() para el año
- setMonth() y setUTCMonth() para el mes (0-11)
- setDate() y setUTCDate() para el día del mes (1-31)
- setHours(), setMinutes(), setSeconds() para el tiempo
- setTime() para establecer el timestamp completo
Retorno de los métodos set
Todos los métodos set devuelven el nuevo timestamp en milisegundos desde la época Unix. Esto permite encadenar múltiples operaciones set o verificar que la modificación fue exitosa comprobando el valor de retorno.
Métodos Set para Componentes de Fecha
Los métodos básicos para modificar fechas son setFullYear(), setMonth() y setDate(). La trampa: setMonth() usa valores 0-11 (enero=0), igual que getMonth(), y esta inconsistencia con meses 1-12 del mundo real causa el error más común al modificar fechas. Otro gotcha: setDate(0) no causa error, establece el último día del mes anterior, un truco útil para calcular fin de mes pero confuso si no lo conoces.
setFullYear() reemplazó al peligroso setYear() obsoleto que causó problemas Y2K. setFullYear() siempre usa cuatro dígitos (2025, no 25) y funciona correctamente con cualquier año. setMonth() y setDate() ajustan automáticamente: setMonth(13) avanza al año siguiente, setDate(35) avanza 4-5 días al mes siguiente. Este ajuste automático es poderoso para cálculos ("3 meses desde hoy") pero silencia errores si pasas valores incorrectos accidentalmente.
Advertencia sobre setYear()
El método setYear() está obsoleto y no debe usarse. Siempre usa setFullYear() para modificar el año, ya que setYear() puede interpretar años de dos dígitos incorrectamente y causar bugs difíciles de detectar.
Ajuste Automático de Meses
El ajuste automático de meses permite cálculos simples: sumar 6 meses a octubre (mes 9) da setMonth(15), que JavaScript ajusta automáticamente a abril (mes 3) del año siguiente. Esto elimina la necesidad de lógica condicional para verificar si el mes excede 11. Sin embargo, ten cuidado con días del mes: si la fecha es 31 de enero y sumas 1 mes, obtienes 3 de marzo (o 2 si es año bisiesto) porque febrero no tiene 31 días.
Este comportamiento de "overflow" causa bugs sutiles: al sumar 1 mes a 31 de enero, esperas 28/29 de febrero, pero JavaScript intenta setDate(31) en febrero, lo ajusta a 3 de marzo. Para evitarlo, establece el día a un valor seguro (1 o menor que 29) antes de cambiar el mes, luego restaura el día original si es necesario. Las librerías como date-fns y Day.js manejan esto automáticamente, por eso son populares.
Métodos Set para Componentes de Tiempo
Los métodos de tiempo (setHours, setMinutes, setSeconds, setMilliseconds) modifican componentes individuales del tiempo. Un patrón común: normalizar fechas a medianoche con setHours(0, 0, 0, 0) para comparar solo fechas sin tiempo. Esto es crítico en comparaciones: "2025-01-15 14:30" y "2025-01-15 09:00" son fechas diferentes si incluyes tiempo, iguales si normalizas a medianoche. Los métodos también ajustan automáticamente: setHours(25) avanza al día siguiente, setMinutes(90) avanza 1 hora 30.
setHours() acepta hasta 4 argumentos opcionales: setHours(hour, min, sec, ms), permitiendo establecer múltiples componentes en una sola llamada. Esto es más eficiente que llamar cuatro métodos separados. Ten cuidado con setMilliseconds(): solo modifica 0-999 ms del segundo actual, NO establece el timestamp completo (para eso usa setTime()). Esta confusión es común cuando intentas copiar o restaurar timestamps.
Normalizar tiempo a medianoche
Para establecer una fecha a medianoche (00:00:00.000), usa setHours(0, 0, 0, 0). Esto es útil cuando trabajas con rangos de fechas y necesitas comparar solo la fecha sin considerar la hora.
Método setTime(): Establecer Timestamp
setTime() reemplaza TODO el timestamp del objeto Date con un número de milisegundos desde la época Unix. A diferencia de otros métodos set que modifican componentes individuales, setTime() sobrescribe completamente la fecha y hora. Es el método más eficiente para clonar fechas (new Date().setTime(fecha.getTime())), realizar aritmética de fechas (agregar 86400000 ms para sumar un día), o sincronizar fechas con timestamps de APIs REST.
setTime() es útil para operaciones matemáticas porque trabajar con milisegundos es aritmética simple: sumar 3600000 ms = +1 hora, restar 604800000 ms = -7 días. No necesitas preocuparte por días del mes, horario de verano, o años bisiestos, JavaScript maneja todo internamente. El método devuelve el nuevo timestamp, permitiendo encadenar operaciones o usar el resultado directamente en comparaciones.
Métodos Set UTC: Tiempo Universal
Los métodos UTC (setUTCFullYear, setUTCMonth, setUTCDate, etc.) modifican componentes en tiempo universal, ignorando la zona horaria local. La diferencia crítica: si en Nueva York (UTC-5) llamas setHours(1) un 1 de enero, estableces 1:00 AM hora local (6:00 AM UTC). Si llamas setUTCHours(1), estableces 1:00 AM UTC (8:00 PM del 31 de diciembre hora local). Esta diferencia puede cambiar no solo la hora, sino también el día, mes o incluso año dependiendo de la zona horaria.
La regla de oro: si almacenas fechas en UTC (práctica recomendada para bases de datos y APIs), usa métodos UTC para modificarlas. Si mezclas métodos locales y UTC, obtienes bugs sutiles: un usuario en Tokyo modifica una fecha y un usuario en Londres ve la fecha incorrecta. La consistencia es crítica: si tu arquitectura es UTC-first, SIEMPRE usa métodos UTC para modificar, solo convierte a local para mostrar al usuario.
Consistencia en uso de métodos
Si usas métodos UTC para establecer una fecha, también deberías usar métodos UTC para obtener los componentes. Mezclar métodos locales y UTC puede causar confusión y bugs difíciles de detectar.
Comportamiento de Ajuste Automático
El ajuste automático es el superpoder y el talón de Aquiles de los métodos set. Cuando setDate(32) ajusta automáticamente al mes siguiente, esto es útil para "sumar 31 días", pero también oculta errores si pasaste 32 accidentalmente esperando un error. JavaScript nunca lanza excepciones por valores fuera de rango, silenciosamente ajusta la fecha. Esto significa que bugs pueden pasar inadvertidos en testing y explotar en producción con datos edge.
El ajuste automático funciona en cascada: si estableces un día mayor a 31, JavaScript ajustará el mes; si el mes también excede 11, ajustará el año. Estos son algunos ejemplos prácticos del ajuste automático:
- <strong>setDate(32):</strong> Se convierte en día 1 del mes siguiente
- <strong>setMonth(13):</strong> Se convierte en mes 1 (febrero) del año siguiente
- <strong>setHours(25):</strong> Se convierte en hora 1 del día siguiente
- <strong>setDate(0):</strong> Se convierte en el último día del mes anterior (útil para calcular fin de mes)
Este comportamiento es consistente en todos los métodos set y permite realizar cálculos de fechas sin preocuparse por los límites de cada componente. Es especialmente útil para operaciones como "sumar 30 días" o "restar 3 meses".
Sumar días a una fecha
Para sumar días a una fecha, usa setDate(fecha.getDate() + dias). JavaScript ajustará automáticamente el mes y año si es necesario. Este patrón es más simple que calcular manualmente los nuevos valores de mes y año.
Errores Comunes con Métodos Set
Al trabajar con métodos set, hay varios errores comunes que pueden causar bugs difíciles de detectar. Conocer estos patrones problemáticos te ayudará a escribir código más robusto y evitar problemas en producción.
Error: Mutación Inesperada
Los objetos Date son mutables: los métodos set modifican el objeto original, afectando todas las referencias al mismo objeto. Este es un bug clásico: pasas una fecha a una función, la función usa setMonth(), y el objeto original fuera de la función quedó modificado. Este comportamiento es diferente a strings o números que son inmutables. En arquitecturas funcionales (React, Redux), esta mutabilidad causa bugs difíciles de detectar porque viola el principio de inmutabilidad.
Siempre crea copias antes de modificar: new Date(fechaOriginal) clona el objeto creando una instancia independiente. Esto es especialmente crítico en funciones puras, reducers de Redux, o componentes React. Alternativa: usa librerías como date-fns que retornan nuevas fechas en lugar de mutar, alineándose mejor con paradigmas funcionales. El costo de no copiar: bugs sutiles donde modificar una fecha afecta inesperadamente otras partes del código.
Error: Mes 0-indexado en setMonth()
Al igual que con getMonth(), el método setMonth() espera valores 0-indexados. Si pasas 1 para enero, JavaScript interpretará esto como febrero. Este error es especialmente común cuando migras código de otros lenguajes donde los meses son 1-indexados.
Para evitar este error, recuerda que setMonth() espera valores del 0 al 11, donde 0 es enero y 11 es diciembre. Si necesitas trabajar con valores 1-indexados, ajusta el valor restando 1 antes de llamar setMonth().
Error: Usar setYear() Obsoleto
setYear() está obsoleto desde ES3 (1999) pero todavía existe por compatibilidad. El problema: interpreta años 0-99 como 1900-1999, causando bugs Y2K. setYear(25) establece 1925, no 2025. Este método es una reliquia de cuando los años de dos dígitos eran comunes para ahorrar memoria. Usar setYear() hoy es un error: puede aparecer en código legacy o tutoriales antiguos, pero nunca debe usarse en código nuevo.
SIEMPRE usa setFullYear(). Es el reemplazo oficial de setYear() y maneja años correctamente. setFullYear(2025) funciona correctamente, incluso setFullYear(25) establece el año 25 AD (no 1925), aunque deberías siempre usar cuatro dígitos para claridad. Si encuentras setYear() en código existente durante revisiones de código o refactoring, reemplázalo inmediatamente con setFullYear(). Este cambio simple previene bugs futuros en sistemas de larga vida.
Resumen: Métodos Set de Date
Conceptos principales:
- •Los métodos set modifican el objeto Date in-place
- •setMonth() acepta valores 0-11 (enero=0, diciembre=11)
- •JavaScript ajusta automáticamente valores fuera de rango
- •setFullYear() es más seguro que setYear() obsoleto
- •Los métodos UTC modifican componentes en tiempo universal
Mejores prácticas:
- •Crea copias de objetos Date antes de modificarlos
- •Usa setFullYear() en lugar de setYear()
- •Aprovecha el ajuste automático para cálculos de fechas
- •Usa métodos UTC para consistencia entre zonas horarias
- •Verifica el valor de retorno de los métodos set