- Moment.js simplifica la gestión de fechas y horas en JavaScript con una API clara y potente.
- Permite analizar, manipular, validar y mostrar fechas en cualquier formato y zona horaria.
- Se integra fácilmente en proyectos y es compatible con plugins y librerías externas como IronPDF.
Trabajar con fechas y horas en JavaScript puede ser una auténtica odisea para quienes desarrollan aplicaciones web. Por suerte, existen herramientas como Moment.js que simplifican considerablemente este proceso, facilitando desde el formateo básico de fechas hasta operaciones complejas de manipulación y validación. Si alguna vez te has sentido frustrado intentando convertir, comparar o mostrar fechas correctamente en tus proyectos, probablemente Moment.js haya estado entre tus principales aliados o, al menos, deberías considerarlo.
En este artículo te cuento todo lo que necesitas saber sobre Moment.js: desde sus funciones principales y trucos menos conocidos, hasta casos prácticos y su integración con otras librerías, pasando por una explicación clara de su sintaxis y las tareas que puedes solucionar con ella. También veremos sus limitaciones, actualizaciones recientes y qué alternativas tienes en caso de buscar algo más moderno.
¿Qué es Moment.js y por qué se ha vuelto tan popular?
Moment.js es una biblioteca de JavaScript diseñada para que trabajar con fechas y horas no sea un quebradero de cabeza. Permite crear, analizar, manipular y mostrar fechas en cualquier formato imaginable con una sintaxis sencilla y potente. Esta librería ha sido, durante años, la principal solución de la comunidad para superar las limitaciones del objeto Date() nativo de JavaScript.
El núcleo de Moment.js gira en torno al objeto moment(), que es capaz de construir fechas a partir de casi cualquier entrada válida: cadenas de texto, objetos Date, timestamps, o directamente con argumentos numéricos. Esto lo hace extremadamente flexible y útil en todo tipo de proyectos, desde pequeños scripts hasta aplicaciones empresariales que gestionan horarios internacionales o registros históricos.
¿Qué la ha hecho triunfar? Su fiabilidad, facilidad de uso y la variedad de herramientas y plugins que la acompañan. Incluso cuando el proyecto ha entrado en modo mantenimiento, Moment.js mantiene una gran base de usuarios y una documentación extensa, lo que refuerza su posición como solución de referencia para fechas en JavaScript y Node.js.
Principales características y ventajas de Moment.js
- API simple e intuitiva: Una de las grandes bazas de Moment.js es su sintaxis clara. Puedes hacer desde operaciones sencillas, como obtener la fecha actual o convertir un string a un formato específico, hasta realizar cálculos complejos y validaciones en un par de líneas.
- Parseo y formateo flexible: Analizar cadenas de fechas de casi cualquier formato y convertirlas a la salida deseada nunca ha sido tan fácil. Moment.js permite formatear fechas en presentaciones customizadas muy rápido y sin complicaciones.
- Manipulación de fechas: Sumar o restar días, meses, años, semanas, o cualquier otra unidad de tiempo es tan sencillo como usar los métodos add() y subtract(). Esto es muy útil cuando necesitas trabajar con fechas relativas, vencimientos o plazos que varían dinámicamente.
- Validación robusta: Si necesitas comprobar si una fecha es válida o si existe (por ejemplo, el 30 de febrero), Moment.js te lo pone en bandeja. El método isValid() es capaz de detectar errores sutiles en el formato o lógica de las fechas.
- Soporte para zonas horarias y localización: Gracias a su plugin moment-timezone, es muy sencillo convertir fechas entre diferentes husos horarios. Además, puedes presentar fechas adaptadas a los idiomas y convenciones regionales del usuario, lo que es clave en aplicaciones globales.
- Ecosistema de plugins: Al margen de la librería principal, existe un ecosistema de plugins para ampliar su funcionalidad (calendario, compatibilidad con otros frameworks, formatos exóticos…).
Cómo empezar a usar Moment.js en tu proyecto
La instalación es muy directa. Puedes incluir Moment.js en tu HTML con una sola línea:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
Si trabajas con Node.js o un entorno de desarrollo moderno, lo habitual es instalarlo mediante npm o yarn:
npm install moment
Una vez hecho esto, puedes importar Moment.js según la sintaxis que utilices:
// Versión CommonJS
var moment = require('moment');
moment().format();
// ES6
import moment from 'moment';
moment().format();
Creación de fechas: diferentes formas y ejemplos prácticos
Crear fechas fácilmente
Para obtener la fecha y hora actual, usa simplemente moment()
:
console.log(moment()); // Devuelve la fecha actual en formato ISO8601
Puedes construir una fecha específica pasando argumentos:
moment("2022-10-14"); // Crea el 14 de octubre de 2022
También puedes partir de una cadena y un formato dado, incluso en modo estricto:
moment("25/12/1995", "DD/MM/YYYY", true); // Analiza y comprueba el formato
¿Tienes un objeto Date nativo?
const fechaJS = new Date();
const miFecha = moment(fechaJS);
Formateo y presentación de fechas
Moment.js permite mostrar fechas en cualquier formato imaginable. Por ejemplo, para mostrar la fecha actual como día/mes/año:
moment().format('DD/MM/YYYY');
Si quieres una cadena más humanizada, puedes usar:
moment().format('MMMM Do YYYY, h:mm:ss a'); // Ejemplo: "marzo 8º 2024, 3:21:10 pm"
Algunos tokens útiles para el formateo:
YYYY
: año de 4 cifrasMM
: mesDD
: día del meshh
oHH
: hora (formato 12h o 24h)mm
: minutosss
: segundosa
: am/pm
Por ejemplo, para mostrar sólo la hora:
moment().format('HH:mm:ss');
Formateo avanzado con tokens y soporte regional
Moment.js soporta múltiples formatos localizados y traducciones. Es posible cambiar de idioma sobre la marcha para mostrar nombres de meses y días en otro idioma:
moment.locale('es'); // Cambia a español
document.write(moment().format('LLLL'));
// Ejemplo: martes, 8 de marzo de 2024 15:21
Manipulación de fechas: sumas, restas y comparaciones
Trabajar con fechas relativas es una de las fortalezas de Moment.js.
- Sumar días, meses o años:
moment().add(3, 'days').format('DD/MM/YYYY');
- Restar unidades:
moment().subtract(2, 'months').format('DD/MM/YYYY');
- Inicio y fin de periodos:
moment().startOf('month').format('DD/MM/YYYY'); // Primer día del mes moment().endOf('month').format('DD/MM/YYYY'); // Último día del mes
Validar fechas y detectar errores
Antes de operar con fechas es vital validar que sean correctas:
moment('2024-02-30', 'YYYY-MM-DD').isValid(); // false, el 30 de febrero no existe
Esto evita bugs inesperados en aplicaciones que reciben fechas del usuario.
Comparación de fechas: comprobar si una fecha está entre otras
Moment.js incorpora varios métodos para comparar fechas:
- isBefore(): Comprueba si una fecha es anterior a otra.
- isAfter(): Comprueba si una fecha es posterior.
- isBetween(): Indica si una fecha está entre dos dadas.
let hoy = moment();
let ayer = moment().subtract(1, 'days');
console.log(hoy.isAfter(ayer)); // true
Manejo de zonas horarias y fechas internacionales
Cuando trabajas con usuarios en distintas partes del mundo, las zonas horarias pueden convertirse en una trampa. Con el plugin moment-timezone puedes convertir fácilmente fechas entre regiones:
const moment = require('moment-timezone');
const fechaUTC = moment('2024-05-25');
const fechaNY = fechaUTC.tz('America/New_York').format('YYYY-MM-DD HH:mm:ss');
console.log(fechaNY);
// Ejemplo: "2024-05-24 20:00:00"
Además, Moment.js es capaz de presentar fechas adaptadas a la configuración regional del usuario, mostrando nombres de meses y días correctamente traducidos.
Ejemplos de uso clave y trucos avanzados
Obtener diferencias entre fechas
Puedes calcular el tiempo transcurrido entre dos fechas en distintas unidades:
let inicio = moment('2024-01-01');
let fin = moment('2024-03-08');
let dias = fin.diff(inicio, 'days'); // Devuelve el número de días entre ambas
Fechas relativas y tiempos humanos
Moment.js es ideal para mostrar mensajes del tipo «hace 3 días» o «en 5 horas»:
moment().subtract(3, 'days').fromNow(); // "hace 3 días"
moment().add(2, 'hours').fromNow(); // "en 2 horas"
Calendario humano
La función calendar() muestra fechas relativas como «ayer a las 17:00», «mañana a las 9:00», haciéndolo muy usable para apps de agenda.
moment().subtract(1, 'days').calendar(); // "Ayer a las..."
moment().add(3, 'days').calendar(); // "Próximo martes a las..."
Soporte para saltos de año y días especiales
¿Quieres saber si un año es bisiesto?
moment([2024]).isLeapYear(); // true
El método isLeapYear() te da la respuesta de forma directa.
Personalización avanzada: formatos, tokens y parseo estricto
Moment.js permite trabajar con cadenas y tokens personalizados para crear o leer fechas de infinidad de formatos. Además, el modo estricto exige coincidencias exactas, evitando errores sutiles y sorpresas indeseadas.
Por ejemplo, para analizar una fecha en el formato «día/mes/año»:
moment('12/03/2023', 'DD/MM/YYYY', true);
Listado de tokens habituales y ejemplos
- Año: YYYY (2024), YY (24), Y (-500)
- Mes: MM (01 – 12), MMM (Jan), MMMM (January)
- Día: DD (01 – 31), Do (1st – 31st)
- Hora: HH (00 – 23), hh (01 – 12), mm (minutos), ss (segundos)
- Zona horaria: Z, ZZ
Estos tokens se pueden combinar para componer salidas totalmente personalizadas. Consulta la documentación para ver la lista completa y casos especiales.
Tabla de Contenidos
- ¿Qué es Moment.js y por qué se ha vuelto tan popular?
- Principales características y ventajas de Moment.js
- Cómo empezar a usar Moment.js en tu proyecto
- Creación de fechas: diferentes formas y ejemplos prácticos
- Formateo y presentación de fechas
- Manipulación de fechas: sumas, restas y comparaciones
- Comparación de fechas: comprobar si una fecha está entre otras
- Manejo de zonas horarias y fechas internacionales
- Ejemplos de uso clave y trucos avanzados
- Personalización avanzada: formatos, tokens y parseo estricto