Fechas

<< Módulos Expresiones Regulares >>

La clase Date

En JavaScript, la clase Date se utiliza para representar una fecha, hora y zona horaria. Además, encapsula métodos para operar con esa fecha.

let date = new Date(); // Crea objeto Date almacena la fecha actual
console.log(typeof date); // Imprime object
console.log(date instanceof Date); // Imprime true
console.log(date); // Imprime por ejemplo: Fri Jun 24 2016 12:27:32 GMT+0200 (CEST)

El constructor de Date puede recibir el número de milisegundos desde el 1/1/1970 a las 00:00:00 GMT (también llamado Epoch time o UNIX time). Si pasamos más de un número, (sólo el primero y el segundo son obligatorios),el orden debería ser: 1º → año, 2º → mes (0..11), 3º → día, 4º → horas, 5º → minutos, 6º → segundos. Otra opción es pasar un string que contenga la fecha en un formato estándar internacional.

let date  = new Date(1363754739620); // Nueva fecha 20/03/2013 05:45:39 (milisegundos desde Epoch)
let date2 = new Date(2015, 5, 17, 12, 30, 50); // 17/06/2015 12:30:50 (Mes empieza en 0 -> Ene, ... 11 -> Dic)
let date3 = new Date("2015-03-25"); // Formato de fecha largo sin la hora YYYY-MM-DD (00:00:00)
let date4 = new Date("2015-03-25T12:00:00"); // Formato fecha largo con la fecha
let date5 = new Date("03/25/2015"); // Formato corto MM/DD/YYYY
let date6 = new Date("25 Mar 2015");  // Formato corto con el mes en texto (March también sería válido).
let date7 = new Date("Wed Mar 25 2015 09:56:24 GMT+0100 (CET)"); // Formato completo con timezone

Si, en lugar de un objeto Date, queremos directamente obtener los milisegundos que han pasado desde el 1/1/1970 (Epoch), lo que tenemos que hacer es usar los métodos Date.parse(string) y Date.UTC(año, mes, día, hora, minuto, segundos). También podemos usar Date.now(), para la fecha y hora actual en milisegundos.

let nowMs = Date.now(); // Momento actual en ms
let dateMs = Date.parse("25 Mar 2015"); // 25 Marzo 2015 en ms
let dateMs2 = Date.UTC(2015, 2, 25); // 25 Marzo 2015 en ms

Métodos de la clase Date

La clase Date tiene setters y getters para las propiedades: fullYear, month (entre 0: enero y 11: diciembre), date (día del mes: 1-31), hours, minutes, seconds, y milliseconds. También el método getDay() nos devuelve el día de la semana actual (entre 0:domingo y 6:sábado). Si pasamos un valor negativo, por ejemplo, fecha.setMonth(-1), se establece el último mes (diciembre) del año anterior.

// Crea un objeto fecha de hace 2 horas
let twoHoursAgo = new Date(Date.now() - (1000*60*60*2)); // (Ahora - 2 horas) en ms
// Ahora hacemos lo mismo,pero usando el método setHours
let now = new Date();
now.setHours(now.getHours() - 2);

Cuando queramos imprimir la fecha, tenemos métodos que nos la devuelven en diferentes formatos:

let now = new Date(); // Imaginemos que ahora es 01/06/2016

console.log(now.toString());
console.log(now.toISOString()); // Imprime 2016-06-26T18:00:31.246Z
console.log(now.toUTCString()); // Imprime Sun, 26 Jun 2016 18:02:48 GMT
console.log(now.toDateString()); // Imprime Sun Jun 26 2016
console.log(now.toLocaleDateString()); // Imprime 26/6/2016
console.log(now.toTimeString()); // Imprime 20:00:31 GMT+0200 (CEST)
console.log(now.toLocaleTimeString()); // Imprime 20:00:31

API de Internacionalización (Intl)

La nueva API de internacionalización de JavaScript ofrece entre otras cosas la posibilidad de formatear las fechas, formatear números y comparar cadenas utilizando las particularidades del idioma que elijamos.

Intl.Collator

Genera un comparador de cadenas que tiene en cuenta el idioma. Por ejemplo, si lo configuramos en español (es), podrá comparar palabras con acentos, la letra ñ, etc.

let a = ['adiós', 'árbol', 'oído', 'óptimo', 'ñapa', 'niño'];
a.sort();
console.log(a.toString()); // adiós,niño,oído,árbol,ñapa,óptimo (ordena en ingés - por defecto)
a.sort(new Intl.Collator('es').compare);
console.log(a.toString()); // adiós,árbol,niño,ñapa,oído,óptimo (ordena en español)

Intl.ListFormat

A partir de una colección, genera una cadena con los elementos de la lista pero tienendo el cuenta la conjunción usada para el último elemento según el idioma elegido (en español sería 'y' o 'o').

let a = ['perro', 'gato', 'pez', 'loro'];

const formatter = new Intl.ListFormat('es', { style: 'long', type: 'conjunction' });
console.log(formatter.format(a)); // perro, gato, pez y loro

const formatter2 = new Intl.ListFormat('es', { style: 'long', type: 'disjunction' });
console.log(formatter2.format(a)); // perro, gato, pez o loro

const formatter3 = new Intl.ListFormat('es', { style: 'short', type: 'unit' });
console.log(formatter3.format(a)); // perro, gato, pez, loro

Intl.NumberFormat

Formatea un número teniendo el cuenta el separador de decimales o millares que tenga el idioma. También puede añadir el símbolo de una moneda que elijamos (antes o después, según el idioma).

let number = 15300.9555;

console.log(new Intl.NumberFormat('en-UK').format(number)); // 15,300.956
console.log(new Intl.NumberFormat('es-ES').format(number)); // 15.300,956

console.log(new Intl.NumberFormat('es-ES', { style: 'currency', currency: 'EUR' }).format(number));
// 15.300,96 €
console.log(new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(number));
// $15,300.96

Intl.DateTimeFormat

Este clase permite formatear fechas teniendo en cuenta el idioma. Se pueden configurar varios parámetros del estilo de la fecha como se puede ver en los siguientes ejemplos:

let date = new Date('2022-04-25');

console.log(new Intl.DateTimeFormat('es-ES').format(date)); // 25/4/2022 (por defecto)

console.log(new Intl.DateTimeFormat('es-ES', {
    dateStyle: "short"
}).format(date)); // 25/4/22

console.log(new Intl.DateTimeFormat('es-ES', {
    dateStyle: "full"
}).format(date)); // lunes, 25 de abril de 2022

console.log(new Intl.DateTimeFormat('es-ES', {
    day: "2-digit", month: "2-digit", year: "numeric"
}).format(date)); // 25/04/2022

console.log(new Intl.DateTimeFormat('es-ES', {
    day: "numeric", month: "long", year: "numeric" ,
    hour: 'numeric', minute: 'numeric', hourCycle: 'h12', dayPeriod: 'long'
}).format(date)); // 25 de abril de 2022 2:00 de la madrugada

<< Módulos Expresiones Regulares >>