Trabajar fechas y horas con JavaScript siempre ha sido un poco engorroso. Por lo que en este artículo vamos a trabajar con una librería de JavaScript especialmente diseñada para manipular fechas.
Primeros pasos con Moment.js
Moment.js es una librería gratuita que podemos descargar desde la página del proyecto. Moment.js se puede ejecutar desde el navegador, así como desde una aplicación Node.js. Para poder utilizarlo con Node.js, hay que instalar su módulo con el siguiente comando.
npm install moment
Luego, simplemente la incluimos y ya podemos trabajar con ella.
var moment = require('moment');
moment().format();
A fin de ejecutar Moment.js desde el navegador, simplemente descargamos el script y lo incluimos usando la etiqueta script. Aquí, Moment.js crea un objeto global llamado moment, el cual se puede utilizar para acceder a todas las funcionalidades de manipulación y parseo de fechas y hora.
<script src="moment.js"></script>
<script>
moment().format();
</script>
Formatear Fechas
En el pasado, para formatear strings de fechas a objetos Date, se requería individualizar partes de los datos y luego realizar concatenaciones de strings. Moment.js nos ha simplificado este proceso de conversión de fechas a cualquier formato en especial. La conversión del formato de fechas con Moment.js es muy simple, por ejemplo.
moment().format('YYYY MM DD');
Moment() devuelve la fecha y hora actual, mientras que format() convierte la fecha y hora actual al formato especificado. El ejemplo anterior formatea una fecha como un año de cuatro dígitos, seguido de un espacio, seguido de un mes de dos dígitos, otro espacio y una fecha de dos dígitos.
Validar Fechas
Otra tarea molesta que Moment.js ha simplificado es la validación de fechas. Con el fin de realizar la validación, simplemente pasamos una cadena de la fecha al objeto moment y llamamos al método isValid(). Este método devuelve true si la fecha es válida y false en caso contrario. Por ejemplo…
var dateEntered = $('#txtEnteredDate').val();
if (!moment(dateEntered).isValid()) {
console.log('Invalid Date');
} else {
console.log('Valid Date');
}
Además de la mencionada, hay otra variada gama de información que el objeto moment() puede proporcionarnos:
overflow.- Se establece cuando el valor se excede. Por ejemplo, cuando estamos en el décimo tercer mes o en el día 32.
invalidMonth.- Se establece cuando el mes es inválido, por ejemplo Jannuarry.
empty.- Se establece cuando la fecha introducida no contiene datos parseables.
nullInput.- Se establece cuando la fecha introducida es null.
Manipular Fechas
Hay un buen número de opciones para manipular el objeto moment. Por ejemplo, se puede sumar o restar fechas (días, meses, años, etc.). Esto se logra mediante el uso de los métodos add() y subtract(). El siguiente ejemplo muestra cómo se agregan siete días, meses o semanas a la fecha actual.
moment().add('days', 7); // adds 7 days to current date
moment().add('months', 7); // adds 7 months to current date
moment().add('years', 7); // adds 7 years to current date
De igual forma, el método subtract() se muestra a continuación.
moment().subtract('days', 7); // subtracts 7 days to current date
moment().subtract('months', 7); // subtracts 7 months to current date
moment().subtract('years', 7); // subtracts 7 years to current date
Calcular el tiempo transcurrido desde ahora
Otra tarea recurrente que realizamos es calcular el tiempo transcurrido entre dos fechas. Para ello, Moment.js utiliza el método fromNow(). Por ejemplo…
moment().fromNow();
El código anterior muestra “a few seconds ago” (hace unos segundos). Si proveemos una fecha al objeto moment nos mostrará el rango de tiempo a partir de ahora. Por ejemplo, el siguiente código muestra “7 days ago”.
var dateA = moment().subtract('days', 7);
dateA.fromNow();
fromNow() también es usado para comparar el tiempo respecto de la fecha actual. Este es un caso especial de from(), el cual compara dos fechas proporcionadas. Un ejemplo que utiliza el método from() se muestra a continuación. Este código muestra “in a day” (en un día).
var dateB = moment('2014-12-12');
var dateC = moment('2014-12-11');
console.log(dateB.from(dateC));
Calcular la diferencia entre dos fechas
Moment.js ofrece una manera sencilla para calcular la diferencia entre dos fechas. La diferencia se calcular en base a milisegundos, aunque también puede ser devuelto en días, meses, años, etc. Para calcular la diferencia, llamamos al método diff(). Este método toma una fecha como su primer argumento. La unidad de tiempo puede ser definida mediante el segundo y opcional argumento. Si este no es proporcionado, se calculará en base a milisegundos. Por ejemplo…
var dateB = moment('2014-11-11');
var dateC = moment('2014-10-11');
console.log('Difference is ', dateB.diff(dateC), 'milliseconds');
console.log('Difference is ', dateB.diff(dateC, 'days'), 'days');
console.log('Difference is ', dateB.diff(dateC, 'months'), 'months');
Soporte de idiomas
Moment.js ofrece soporte a una multitud de idiomas. Se puede asignar un idioma global o definir el idioma para un objeto moment en particular. Por defecto, Moment.js soporta el idioma Inglés. Si se desea añadir soporte a otro idioma, le asignamos el valor clave de ese idioma en particular a moment.lang. Por ejemplo, el siguiente código muestra como añadir soporte al español.
moment.lang("es");
Conclusión
Moment.js es una excelente librería que simplifica el trabajo de manipular, formatear y validar fechas y horas. En este artículo, nos centramos en algunas de las características de moment.js. Sin embargo, la librería también cuenta con una serie de plugins que podemos descargar desde su página oficial.