La API Temporal

Crear fechas en Javascript con la nueva Temporal API


Durante muchos años hemos trabajado con Date en Javascript para manipular las fechas: una forma sencilla, ya bastante antigua y muy limitada. Por esa razón, muchas veces se optaba a librerías externas, más sencillas de utilizar y prácticas para el programador.

Sin embargo, con la API Temporal es muy poco probable que necesites una librería externa. Vamos a aprender a utilizarla.

La API Temporal con fechas

Lo primero es entender que partes conforman la API. Observa las siguientes partes, mediante las cuales podemos crear fechas con más o menos información.

Partes de la APIUnidad de tiempo con la que se trabaja
Temporal.PlainTime❌ Fecha (❌ año, ❌ mes y ❌ día), ✅ Hora, ❌ Zona horaria.
Temporal.PlainYearMonth🟨 Fecha (✅ año, ✅ mes y ❌ día), ❌ Hora, ❌ Zona horaria.
Temporal.PlainMonthDay🟨 Fecha (❌ año, ✅ mes y ✅ día), ❌ Hora, ❌ Zona horaria.
Temporal.PlainDate✅ Fecha (✅ año, ✅ mes y ✅ día), ❌ Hora, ❌ Zona horaria.
Temporal.PlainDateTime ✅ Fecha (✅ año, ✅ mes y ✅ día), ✅ Hora, ❌ Zona horaria.
Temporal.ZonedDateTime✅ Fecha (✅ año, ✅ mes y ✅ día), ✅ Hora, ✅ Zona horaria.
Temporal.InstantMomento exacto en el tiempo. Muy preciso. UTC.
Temporal.NowConjunto de funciones para generar una fecha actual en diferentes formatos.

Las 6 primeras son formatos de fechas con más o menos información, mientras que Temporal.Instant devuelve una fecha UTC y Temporal.Now no es más que un conjunto de funciones para generar una fecha del momento actual en alguno de los formatos anteriores.

Para entenderlo bien, vamos a ver algunos ejemplos y profundizando en los métodos que ofrecen.

Trabajar con fechas

Crear fechas con Temporal es muy sencillo. Básicamente, sólo tenemos que decidirnos por una de las partes anteriores y utilizar sus métodos que comienzan por .from(). También podemos utilizar Temporal.Now o Temporal.Instant.

MétodoDescripción
.from()Crea una fecha, utilizando un , un o una fecha de Temporal.
.compare()Compara dos fechas para saber si la primera es igual, menor o mayor que la segunda.

Por otro lado, el método .compare() nos permite comparar dos fechas y saber si una fecha es mayor, menor o igual que una segunda fecha. Vamos a los ejemplos:

Por ejemplo, utilizando el método .from() podemos crear fechas, indicando por parámetro fechas en , o un propio objeto Temporal:

// Usando un string
const date = Temporal.PlainDate.from("2025-06-07");
const time = Temporal.PlainDateTime.from("13:30:00");
const yearmonth = Temporal.PlainYearMonth.from("2025-06");
const datetime = Temporal.PlainDateTime.from("2025-06-07T13:30:00");
const day = Temporal.ZonedDateTime.from("2025-06-07T13:30:00[Atlantic/Canary]");

// Usando un objeto
const date = Temporal.PlainDateTime.from({
  year: 2025,
  month: 6,
  day: 14,
  hour: 14,
  minute: 30
})

// Usando una fecha Temporal
const date = Temporal.PlainDate.from(datetime);

Otra opción, quizás más cómoda, es utilizar alguno de los métodos que tiene Temporal.Now. Esto nos permite crear objetos de fechas Temporal con la fecha actual ya seteada:

MétodoDescripción
Temporal.Now.instant()Devuelve la fecha y hora actual como un instante UTC.
Temporal.Now.plainTimeISO()Devuelve la fecha y hora actual como objeto Temporal PlainTime.
Temporal.Now.plainDateISO()Devuelve la fecha y hora actual como objeto Temporal PlainDate.
Temporal.Now.plainDateTimeISO()Devuelve la fecha y hora actual como objeto Temporal PlainDateTime.
Temporal.Now.zonedDateTimeISO()Devuelve la fecha y hora actual como objeto Temporal ZonedDateTime.
Temporal.Now.timeZoneId()Devuelve un con la zona horaria.

Además, también podemos usar Temporal.Now.timeZoneId() para obtener un con la zona horaria.

El tipo de dato Temporal.Instant representa un instante o momento exacto en el tiempo en UTC. Puedes crearlo a través de un con el método .from():

MétodoDescripción
Temporal.Instant.from()Crea una fecha y hora a partir de un .
Temporal.Instant.fromEpochMilliseconds()Crea una fecha a partir de un UNIX Timestamp en ms.
Temporal.Instant.fromEpochNanoseconds()Crea una fecha a partir de un UNIX Timestamp en ns.

También puedes usar los métodos .fromEpochMilliseconds() o .fromEpochNanoseconds() para crear una fecha a partir de un número TIMESTAMP en milisegundos o nanosegundos:

// Desde strings
const date = Temporal.Instant.from("2025-06-07T14:30:00Z");
const date = Temporal.Instant.from(new Date().toJSON());

// Timestamps
const date = Temporal.Instant.fromEpochMilliseconds(new Date());
const date = Temporal.Instant.fromEpochNanoseconds(BigInt(new Date()));

// Date
const date = new Date().toTemporalInstant();

Por último, observa que el clásico tipo de dato Date, incorpora un nuevo método .toTemporalInstant() que genera una fecha Instant a partir de una Date.

Por último, aunque no sirve para crear nuevas fechas, podemos utilizar el método .compare() para comparar entre dos fechas y obtener un número que indicará si la primera fecha es anterior a la segunda (-1), igua igual (0), o posterior a la segunda (1):

const before = Temporal.PlainDateTime.from("2025-06-07");
const after = Temporal.PlainDateTime.from("2025-06-08");

Temporal.PlainDate.compare(before, after);    // -1
Temporal.PlainDate.compare(after, after);     // 0
Temporal.PlainDate.compare(after, before);    // 1

Obtener partes de una fecha

Otra de las tareas habituales al trabajar con fechas, es obtener ciertas partes o detalles de una fecha concreta. Temporal API tiene esto solucionado con un nivel de detalle muy específico.

Cuando generamos una fecha con Temporal podemos acceder a cada una de las siguientes propiedades para obtener información como el día del mes, el año, la hora, los minutos, los días que tiene el mes actual, el día del año, los nanosegundos, si el año actual es bisiesto, etc:

Fragmentos o partesDescripciónEjemplo
.yearAño numérico.2025
.monthNúmero del mes (del 1 al 12).6
.dayDía del mes.7
.dayOfWeekDía de la semana (1 = lunes, 7 = domingo).6
.dayOfYearDía del año (del 1 al 365, o 366 si es bisiesto).158
.daysInMonthTotal de días que tiene el mes.30
.daysInYearTotal de días del año actual (365 o 366).365
.hourHora del día (del 0 al 23).13
.hoursInDayTotal de horas del día (24, a veces puede variar).24
.minuteMinuto (del 0 al 59).30
.secondSegundo (del 0 al 59).0
.millisecondNúmero de milisegundos (del 0 al 999).0
.microsecondNúmero de microsegundos (del 0 al 999).0
.nanosecondNúmero de nanosegundos (del 0 al 999).0
.timeZoneIdNombre de la zona horaria. Formato IANA."Atlantic/Canary"
.offsetDesfase horario."+01:00"
.inLeapYearIndica si estamos en un año bisiesto.false

Si necesitas más datos, aquí tienes una tabla con otras propiedades que no se suelen usar tanto, pero que pueden ser muy útiles:

Otras partes interesantes

Aunque no son tan usadas, existen algunas propiedades más que también pueden resultar útiles:

Fragmentos o partesDescripciónEjemplo
.calendarIdIdentificador del calendario usado."iso8601"
.yearOfWeekAño de la semana. En primeros y últimos días del año varia del anterior.2025
.monthCodeCódigo ISO del mes. Útil si no es calendario gregoriano."M06"
.monthsInYearCuántos meses tiene el año. Útil si no es calendario gregoriano.12
.weekOfYearNúmero de la semana del año (del 1 al 53).23
.daysInWeekTotal de días de la semana. Siempre devuelve 7.7
.epochMillisecondsMilisegundos desde el 1970-01-01.1749299400000
.epochNanosecondsNanosegundos desde el 1970-01-01. Muy preciso. En BigInt.1749299400000000000n
.offsetNanosecondsDesfase horario, pero en nanosegundos.3600000000000
.eraEra histórica, como "CE" o "BCE". Útil en calendarios no gregorianos.``
.eraYearEl año dentro de la era histórica. Útil en calendarios no gregorianos.``

Operaciones con fechas

Una vez conocemos todos los detalles anteriores, vamos a ver que métodos podemos utilizar para realizar operaciones con nuestras fechas.

En primer lugar, las fechas generadas con Temporal suelen tener los métodos .add(), .subtract(), .since() y .until(). Los dos primeros sirven para sumar o restar unidades de tiempo a una fecha, mientras que los dos últimos calculan la duración entre una fecha y otra:

MétodosDescripción
.add()Añade una duración. Puede ser un Temporal.Duration, un o un .
.subtract()Reduce una duración. Puede ser un Temporal.Duration, un o un .
.since()Calcula la duración desde la fecha indicada hasta la fecha actual.
.until()Calcula la duración hasta la fecha indicada desde la fecha actual.

En estos métodos se pueden utilizar Temporal.Duration, un objeto de Javascript que representa duraciones y que veremos en el próximo artículo.

Al margen del método estático .compare() que vimos anteriormente, también tenemos métodos como .equals() que nos puede venir muy bien para comparar nuestra fecha Temporal con otra pasada por parámetro, devolviéndonos un para indicar si es igual o no.

MétodosDescripción
.equals()Compara dos fechas para saber si son exactamente iguales.

Usa este método para comparar fechas si buscas saber si son la misma, ya que otras formas o métodos podrían resultar inexactos o poco recomendados.

Temporal.Now.instant().equals(new Date().toTemporalInstant());    // true
Temporal.Now.instant() === new Date().toTemporalInstant();        // false

Por otro lado, podemos utilizar los siguientes métodos para generar nuevas fechas realizando ciertos cambios:

MétodosDescripción
.round()Redondea la fecha, eliminando detalles que no son necesarios.
.with()Crea una nueva fecha cambiando los campos indicados en el de parámetro.
.withPlainTime()Crea una nueva fecha cambiando la hora por la indicada por parámetro.
.withTimeZone()Crea una nueva fecha cambiando la zona horaria por la indicada por parámetro.
.withCalendar()Crea una nueva fecha cambiando el tipo de calendario.

Por ejemplo, .round() nos permite redondear una fecha y eliminar datos innecesarios, mientras que los métodos que comienzan por .with() nos crear una nueva fecha y alterar ciertos detalles de la misma:

Temporal.PlainDateTime.from("2025-06-07T14:30:00").with({ hour: 8, day: 20 });
// Temporal.PlainDateTime 2025-06-20T08:30:00

De la misma forma podemos hacerlo con .withPlainTime() o .withTimeZone(), cambiando detalles específicos. Además, con .withCalendar() podemos incluso cambiar a otro tipo de calendario.

Los tipos de calendario del navegador se pueden consultar con Intl.supportedValuesOf("calendar"). Algunos de ellos suelen ser: chinese, gregory, indian, iso8601, japanese...

Mediante los métodos que comienzan por .to podemos convertir una fecha de un formato a otro. Funcionan de forma muy similar a como funcionaban los métodos que comienzan por .to en Date.

MétodosDescripción
.toInstant()Convierte una fecha en un momento o instante exacto.
.toJSON()Convierte una fecha en un en formato JSON (ISO-8601).
.toLocaleString()Convierte una fecha en el formato de fecha local del navegador.
.toPlainDate()Convierte una fecha en un objeto PlainDate (sólo fecha).
.toPlainDateTime()Convierte una fecha en un objeto PlainDateTime (fecha y hora).
.toPlainTime()Convierte una fecha en un objeto PlainTime (sólo hora).
.toString()Convierte la fecha en un legible. Casi siempre, igual a .toJSON().

Por último, algunos métodos son útiles para las zonas horarias. Por ejemplo, el método .getTimeZoneTransition() nos permite obtener los límites de cambio de zona horaria, pasándole el parámetro "next" o "previous":

MétodosDescripción
.getTimeZoneTransition()Pasandole el "next" o "previous" te dice cuando cambia la zona horaria.
.startOfDay()Devuelve la fecha exacta del principio del día actual.

Por otro lado, .startOfDay() nos devuelve cuando comienza la zona horaria en la franja actual.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev