Saltar al contenido
fechas.js · devschool

Fechas y horas en JavaScript

Lección 22 de 38 · 5 min de lectura · Actualizado el

En esta lección
  1. Cómo guarda JavaScript una fecha
  2. Crear fechas
  3. Leer las partes de una fecha
  4. Calcular con fechas
  5. Mostrar fechas en español
  6. Medir cuánto tarda algo
  7. Para proyectos grandes

Las fechas son una de las partes más traicioneras de cualquier lenguaje: husos horarios, horario de verano, meses de distinta longitud, años bisiestos… JavaScript las maneja con el objeto Date.

Cómo guarda JavaScript una fecha

Internamente, un Date es solo un número: los milisegundos transcurridos desde el 1 de enero de 1970 a las 00:00 en hora UTC (la hora universal, la antigua “hora de Greenwich”). A ese momento se le llama epoch.

const d = new Date();
d.getTime()     // 1790757000000 (por ejemplo)
Date.now()      // lo mismo, sin crear el objeto

Otros sistemas (como Unix o muchas bases de datos) cuentan en segundos, no en milisegundos. Si recibes una marca de tiempo de un servidor y sale una fecha de 1970, probablemente tengas que multiplicar por 1000.

Consejo profesional: guarda, calcula y envía siempre las fechas en UTC (o en milisegundos). Conviértelas a la hora local del usuario solo en el último momento, al mostrarlas.

Crear fechas

new Date()                          // ahora mismo
new Date(0)                         // 1 de enero de 1970, 00:00 UTC
new Date(1790757000000)             // a partir de milisegundos
new Date("2026-10-01T09:30:00Z")    // a partir de un texto ISO (la Z significa UTC)
new Date(2026, 9, 1, 9, 30)         // año, mes, día, hora, minuto en HORA LOCAL

¡Los meses empiezan en 0!

En el constructor y en getMonth(), enero es 0 y diciembre es 11. Los días del mes, en cambio, empiezan en 1. Es uno de los errores más frecuentes:

new Date(2026, 1, 14)   // 14 de FEBRERO, no de enero

Para evitar confusiones con textos, usa siempre el formato ISO: "2026-02-14" (año-mes-día, con meses del 01 al 12).

Hora local y UTC

new Date(2026, 9, 1, 9, 0) interpreta los números como hora local (la de tu ordenador). Si estás en España en horario de verano (UTC+2), internamente se guarda como las 07:00 UTC.

Si necesitas crear una fecha a partir de una hora UTC, usa Date.UTC(), que devuelve milisegundos, y crea el Date con ellos:

const ms = Date.UTC(2026, 9, 1, 9, 0);   // 1 oct 2026, 09:00 UTC
const d = new Date(ms);

Leer las partes de una fecha

const d = new Date(2026, 9, 1, 9, 30);   // jueves 1 de octubre de 2026, 09:30

d.getFullYear()   // 2026
d.getMonth()      // 9 (octubre)
d.getDate()       // 1 (día del mes)
d.getDay()        // 4 (día de la semana: 0 = domingo, 1 = lunes... 6 = sábado)
d.getHours()      // 9
d.getMinutes()    // 30

Todos estos métodos devuelven la hora local. Cada uno tiene su versión UTC: getUTCHours(), getUTCDate(), etc. Y para cambiar partes existen los set: d.setDate(15), d.setHours(0, 0, 0, 0)…

Calcular con fechas

Diferencia entre dos fechas. Al restar dos Date obtienes la diferencia en milisegundos:

const inicio = new Date(2026, 9, 1, 9, 0);
const fin = new Date(2026, 9, 1, 11, 45);
const ms = fin - inicio;              // 9900000
const minutos = ms / (1000 * 60);     // 165

Constantes útiles:

const MS_MINUTO = 60 * 1000;
const MS_HORA = 60 * MS_MINUTO;
const MS_DIA = 24 * MS_HORA;

Sumar tiempo. Aquí hay una trampa: fecha + 30000 no suma, porque el + con un objeto Date convierte la fecha en texto y concatena. Hay que pasar por los milisegundos:

const dentroDeUnaHora = new Date(fecha.getTime() + MS_HORA);

Para sumar días, es más seguro usar setDate, que tiene en cuenta los cambios de hora de verano:

const d = new Date(2026, 9, 30);
d.setDate(d.getDate() + 5);   // 4 de noviembre: pasa de mes solo

Calcular una edad:

function calcularEdad(nacimiento) {
  const hoy = new Date();
  let edad = hoy.getFullYear() - nacimiento.getFullYear();
  const aunNoCumple =
    hoy.getMonth() < nacimiento.getMonth() ||
    (hoy.getMonth() === nacimiento.getMonth() && hoy.getDate() < nacimiento.getDate());
  if (aunNoCumple) edad--;
  return edad;
}

(Dividir los milisegundos entre los de un año de 365 días da una aproximación, pero falla por los años bisiestos.)

Mostrar fechas en español

Nunca construyas el texto a mano con arrays de nombres de meses: usa toLocaleDateString y toLocaleTimeString, o Intl.DateTimeFormat:

const d = new Date(2026, 9, 1, 9, 30);

d.toLocaleDateString("es-ES")          // "1/10/2026"
d.toLocaleTimeString("es-ES")          // "9:30:00"
d.toLocaleDateString("es-ES", {
  weekday: "long", day: "numeric", month: "long", year: "numeric",
})                                     // "jueves, 1 de octubre de 2026"
d.toLocaleTimeString("es-ES", { hour: "2-digit", minute: "2-digit" })  // "09:30"

d.toISOString()                        // "2026-10-01T07:30:00.000Z" (UTC, para guardar o enviar)

Medir cuánto tarda algo

const inicio = performance.now();
// ... código que quieres medir ...
const fin = performance.now();
console.log(`Ha tardado ${(fin - inicio).toFixed(1)} ms`);

performance.now() es más preciso que Date para medir duraciones.

Para proyectos grandes

Date es incómodo para cálculos complejos (zonas horarias, festivos, “el último viernes del mes”). En proyectos serios se suele usar una librería como date-fns o Day.js. Y los navegadores están incorporando Temporal, una API nueva que soluciona casi todos los problemas de Date.

Pruébalo tú

Cambia el código y pulsa Ejecutar (o Ctrl + Enter).

fechas.js
Consola

Pon a prueba lo que has aprendido

[JavaScript] ¿Qué fecha crea new Date(2026, 1, 14)?

[JavaScript] ¿Qué obtienes al restar dos objetos Date?

¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.