preloader

Fecha y Hora

Vamos a explorar el objeto Date de JavaScript, el cual permite manejar y almacenar información sobre fechas y horas, además de ofrecer métodos para su manipulación.

Creación
Para generar una nueva instancia de Date, utilizamos el constructor new Date() con uno de los siguientes formatos de argumento:

new Date()
Sin parámetros, se crea un objeto Date que representa la fecha y hora actual:

				
					let ahora = new Date();
alert( ahora ); // muestra la fecha y hora actuales

				
			

new Date(milliseconds)
Crea un objeto Date basado en el número de milisegundos transcurridos desde el 1 de enero de 1970 UTC+0.

				
					// 0 representa el 01.01.1970 UTC+0
let Enero01_1970 = new Date(0);
alert( Enero01_1970 );

// Añadiendo 24 horas obtenemos el 02.01.1970 UTC+0
let Enero02_1970 = new Date(24 * 3600 * 1000);
alert( Enero02_1970 );

				
			

Un timestamp es un número entero que indica la cantidad de milisegundos desde el inicio de 1970. Los timestamps pueden ser negativos para fechas anteriores a esa referencia:

				
					// 31 de diciembre de 1969
let Dic31_1969 = new Date(-24 * 3600 * 1000);
alert( Dic31_1969 );

				
			

new Date(datestring)
Si el argumento es un string, se analiza y convierte automáticamente a una fecha. Este formato es el mismo que el utilizado por Date.parse:

				
					let fecha = new Date("2017-01-26");
alert(fecha);
// La hora no está definida, así que se asume medianoche GMT (0 hs. de la fecha) y
// se ajusta según el huso horario local, el resultado puede variar
// Thu Jan 26 2017 11:00:00 GMT+1100 (Hora Estándar del Este de Australia)
// o
// Wed Jan 25 2017 16:00:00 GMT-0800 (Hora Estándar del Pacífico)

				
			

new Date(año, mes, fecha, horas, minutos, segundos, ms)
Crea una fecha con los componentes dados en la zona horaria local. Sólo los primeros dos parámetros son obligatorios:

				
					new Date(2011, 0, 1, 0, 0, 0, 0); // 1 de enero de 2011, 00:00:00
new Date(2011, 0, 1); // Igual que arriba, los últimos 4 parámetros se asignan a '0' por defecto.

				
			

La precisión es de 1 ms (1/1000 de segundo):

				
					let fecha = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( fecha ); // 1.01.2011, 02:03:04.567

				
			

Acceso a los componentes de la fecha
Hay métodos para obtener los distintos componentes de una fecha:

				
					getFullYear() // Devuelve el año (4 dígitos)
getMonth() // Devuelve el mes, de 0 a 11
getDate() // Devuelve el día del mes de 1 a 31
getHours(), getMinutes(), getSeconds(), getMilliseconds() // Devuelven las partes correspondientes del tiempo

				
			

Es importante usar getFullYear() en vez de getYear(), que está obsoleto.

Para obtener el día de la semana:

				
					getDay() // Devuelve el día de la semana, de 0 (Domingo) a 6 (Sábado)

				
			

Hay métodos equivalentes que devuelven la fecha y hora en UTC: getUTCFullYear(), getUTCMonth(), getUTCDay(), etc.

				
					let fecha = new Date();

// hora local
alert( fecha.getHours() );

// hora en UTC
alert( fecha.getUTCHours() );

				
			

Estableciendo componentes de la fecha
Para establecer partes específicas de una fecha:

				
					setFullYear(year, [month], 2024)
setMonth(month, 2024)
setDate(date)
setHours(hour, [min], [sec], [ms])
setMinutes(min, [sec], [ms])
setSeconds(sec, [ms])
setMilliseconds(ms)
setTime(milliseconds) // Fija el número de milisegundos desde 01.01.1970 UTC+0

				
			

La autocorrección es una característica útil:

				
					let fecha = new Date(2013, 0, 32); // ¿32 de enero de 2013?
alert(fecha); // Se autocorrige a 1 de febrero de 2013

				
			

Para incrementar fechas automáticamente:

				
					let fecha = new Date(2016, 1, 28);
fecha.setDate(fecha.getDate() + 2);
alert( fecha ); // 1 de marzo de 2016

				
			

Conversión de fechas a números y diferencia entre fechas
Convertir un Date a número toma el valor del timestamp:

				
					let fecha = new Date();
alert(+fecha); // número de milisegundos

				
			

Para medir tiempo transcurrido:

				
					let inicio = new Date();

// función que realiza alguna tarea
for (let i = 0; i < 100000; i++) {
  let hacerAlgo = i * i * i;
}

let fin = new Date();
alert(`El tiempo transcurrido es de ${fin - inicio} ms`);

				
			

Date.now() es útil para medir el tiempo de forma más eficiente:

				
					let inicio = Date.now();

for (let i = 0; i < 100000; i++) {
  let hacerAlgo = i * i * i;
}

let fin = Date.now();
alert( `El bucle tardó ${fin - inicio} ms` );

				
			

Benchmarking
Para medir el rendimiento de funciones que manejan fechas:

				
					function diffSubtract(fecha1, fecha2) {
  return fecha2 - fecha1;
}

function diffGetTime(fecha1, fecha2) {
  return fecha2.getTime() - fecha1.getTime();
}

function bench(f) {
  let fecha1 = new Date(0);
  let fecha2 = new Date();

  let inicio = Date.now();
  for (let i = 0; i < 100000; i++) f(fecha1, fecha2);
  return Date.now() - inicio;
}

alert("Tiempo de diffSubtract: " + bench(diffSubtract) + "ms");
alert("Tiempo de diffGetTime: " + bench(diffGetTime) + "ms");

				
			

Para hacer un benchmark más preciso, ejecuta las pruebas varias veces:

				
					function diffSubtract(fecha1, fecha2) {
  return fecha2 - fecha1;
}

function diffGetTime(fecha1, fecha2) {
  return fecha2.getTime() - fecha1.getTime();
}

function bench(f) {
  let fecha1 = new Date(0);
  let fecha2 = new Date();

  let inicio = Date.now();
  for (let i = 0; i < 100000; i++) f(fecha1, fecha2);
  return Date.now() - inicio;
}

let tiempo1 = 0;
let tiempo2 = 0;

for (let i = 0; i < 10; i++) {
  tiempo1 += bench(diffSubtract);
  tiempo2 += bench(diffGetTime);
}

alert( 'Tiempo total de diffSubtract: ' + tiempo1 );
alert( 'Tiempo total de diffGetTime: ' + tiempo2 );

				
			

Es importante tener en cuenta las optimizaciones de los motores de JavaScript. Para mayor precisión en el benchmark, se recomienda realizar una serie de ejecuciones preliminares:

				
					bench(diffSubtract);
bench(diffGetTime);

for (let i = 0; i < 10; i++) {
  tiempo1 += bench(diffSubtract);
  tiempo2 += bench(diffGetTime);
}

				
			

Date.parse a partir de un string
El método Date.parse(str) convierte un string en una fecha:

				
					let ms = Date.parse("2012-01-26T13:51:50.417-07:00");
alert(ms); // 1327611110417 (timestamp)

				
			

Crear un objeto Date a partir de un timestamp:

				
					let fecha = new Date(Date.parse("2012-01-26T13:51:50.417-07:00"));
alert(fecha);

				
			

Resumen

  • Las fechas y horas en JavaScript se manejan con el objeto Date.
  • Los meses se cuentan desde cero (enero es 0).
  • Los días de la semana comienzan en 0 (domingo).
  • El objeto Date se autocorrige al recibir valores fuera de rango.
  • Las fechas se pueden restar, dando como resultado la diferencia en milisegundos.
  • Date.now() devuelve el timestamp actual en milisegundos.

Para mediciones más precisas, muchos entornos de ejecución ofrecen métodos adicionales como performance.now() en navegadores:

				
					alert(`La carga de la página comenzó hace ${performance.now()}ms`);

				
			

Related Post

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *