Trabajando con moment.js

Librería javascript indispensable para manipular la fecha y la hora

Atención, esta librería es antigua. Hay alternativas como luxon, dayjs o datefns entre otras.

La manipulación de la fecha y la hora en Javascript siempre ha causado dolores de cabeza a los desarrolladores. Es una de las partes más tediosas del lenguaje. Por suerte han aparecido librerías como momentjs que nos facilitarán enormemente trabajar con el objeto Date. Una vez hayas leído este artículo la encontrarás indispensable.

Puedes descargar la última versión de moment.js en su página oficial. Este framework es gratuito y de código libre.

Ejemplos básicos

Vamos a la acción con una serie de ejemplos:

Creamos un objeto moment

const ahora = moment()

Creamos una fecha año, mes, dia

const fechaHoy = moment([2015, 3, 15]);

Hasta aquí nada nuevo, casi exactamente igual que crear un objeto Date de Javascript solo que con la nueva librería.

Hora actual

moment().format('HH:mm:ss') // "15:46:28"

Día de la semana

moment().day() // numérico indicando el número de día
moment().format('HH:mm:ss') // "15:46:28"

Mes actual

moment().month // numérico indicando el número de mes
moment().format('HH:mm:ss') // "15:46:28"

Nombre del mes actual

moment.months()[moment().month()] // en inglés: March
moment().format('HH:mm:ss') // "15:46:28"

Trabajando con fechas

Vamos a complicar un poco las cosas:

const fecha = moment([2000, 1, 1]) // 1/1/2000

¿Cuánto tiempo ha pasado?

fecha.fromNow(true) // años que han pasado desde la fecha

fecha.add(20, 'years') // añade 20 años a la fecha

fecha.subtract(20, 'days') // resta 20 días a la fecha

Comprobar si una fecha es anterior a otra

moment('2015-10-20').isBefore('2015-10-21')

Comprobar si es la misma fecha

moment('2015-10-20').isSame('2015-10-20')

Comprobar si la fecha esta entre otras dos

moment('2015-10-20').isBetween('2015-10-19', '2015-10-25')

Comprobar si un año es bisiesto

moment([2000]).isLeapYear()

Usar momentjs en español

Esta librería permite localizarla para el idioma español. Tan solo tenemos que añadir el archivo de las traducciones y definir el idioma antes de ejecutar cualquier otra instrucción:

moment.locale('es')

Si necesitáis todos los idiomas podéis descargarlos en http://momentjs.com/downloads/moment-with-locales.js, pero aquí os dejo la versión en español:

// moment.js locale configuration
// locale : spanish (es)
// author : Julio Napurí : https://github.com/julionc

(function (factory) {
    factory(moment);
}(function (moment) {
    cost monthsShortDot = 'ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic.'.split(','),
        monthsShort = 'ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic'.split(',');

    return moment.defineLocale('es', {
        months : 'enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre'.split(','),
        monthsShort : function (m, format) {
            if (/-MMM-/.test(format)) {
                return monthsShort[m.month()];
            } else {
                return monthsShortDot[m.month()];
            }
        },
        weekdays : 'domingo,lunes,martes,miércoles,jueves,viernes,sábado'.split(','),
        weekdaysShort : 'dom,lun,mar,mié,jue,vie,sáb.'.split(','),
        weekdaysMin : 'Do,Lu,Ma,Mi,Ju,Vi,Sá'.split(','),
        longDateFormat : {
            LT : 'H:mm',
            LTS : 'LT:ss',
            L : 'DD/MM/YYYY',
            LL : 'D [de] MMMM [de] YYYY',
            LLL : 'D [de] MMMM [de] YYYY LT',
            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
        },
        calendar : {
            sameDay : function () {
                return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
            },
            nextDay : function () {
                return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
            },
            nextWeek : function () {
                return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
            },
            lastDay : function () {
                return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
            },
            lastWeek : function () {
                return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
            },
            sameElse : 'L'
        },
        relativeTime : {
            future : 'en %s',
            past : 'hace %s',
            s : 'unos segundos',
            m : 'un minuto',
            mm : '%d minutos',
            h : 'una hora',
            hh : '%d horas',
            d : 'un día',
            dd : '%d días',
            M : 'un mes',
            MM : '%d meses',
            y : 'un año',
            yy : '%d años'
        },
        ordinalParse : /\\d{1,2}º/,
        ordinal : '%dº',
        week : {
            dow : 1, // Monday is the first day of the week.
            doy : 4  // The week that contains Jan 4th is the first week of the year.
        }
    });
}));

No olvides visitar la página oficial de momentjs para leer toda la documentación.