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 API | Unidad 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.Instant | Momento exacto en el tiempo. Muy preciso. UTC. |
Temporal.Now | Conjunto 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étodo | Descripción |
---|---|
.from() | Crea una fecha, utilizando un 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 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étodo | Descripció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 |
Además, también podemos usar Temporal.Now.timeZoneId()
para obtener un
El tipo de dato Temporal.Instant
representa un instante o momento exacto en el tiempo en UTC. Puedes crearlo a través de un .from()
:
Método | Descripción |
---|---|
Temporal.Instant.from() | Crea una fecha y hora a partir de un |
Temporal.Instant.fromEpochMilliseconds() | Crea una fecha a partir de un ms . |
Temporal.Instant.fromEpochNanoseconds() | Crea una fecha a partir de un 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 partes | Descripción | Ejemplo |
---|---|---|
.year | Año numérico. | 2025 |
.month | Número del mes (del 1 al 12). | 6 |
.day | Día del mes. | 7 |
.dayOfWeek | Día de la semana (1 = lunes, 7 = domingo). | 6 |
.dayOfYear | Día del año (del 1 al 365, o 366 si es bisiesto). | 158 |
.daysInMonth | Total de días que tiene el mes. | 30 |
.daysInYear | Total de días del año actual (365 o 366). | 365 |
.hour | Hora del día (del 0 al 23). | 13 |
.hoursInDay | Total de horas del día (24, a veces puede variar). | 24 |
.minute | Minuto (del 0 al 59). | 30 |
.second | Segundo (del 0 al 59). | 0 |
.millisecond | Número de milisegundos (del 0 al 999). | 0 |
.microsecond | Número de microsegundos (del 0 al 999). | 0 |
.nanosecond | Número de nanosegundos (del 0 al 999). | 0 |
.timeZoneId | Nombre de la zona horaria. Formato IANA . | "Atlantic/Canary" |
.offset | Desfase horario. | "+01:00" |
.inLeapYear | Indica 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 partes | Descripción | Ejemplo |
---|---|---|
.calendarId | Identificador del calendario usado. | "iso8601" |
.yearOfWeek | Año de la semana. En primeros y últimos días del año varia del anterior. | 2025 |
.monthCode | Código ISO del mes. Útil si no es calendario gregoriano. | "M06" |
.monthsInYear | Cuántos meses tiene el año. Útil si no es calendario gregoriano. | 12 |
.weekOfYear | Número de la semana del año (del 1 al 53). | 23 |
.daysInWeek | Total de días de la semana. Siempre devuelve 7 . | 7 |
.epochMilliseconds | Milisegundos desde el 1970-01-01 . | 1749299400000 |
.epochNanoseconds | Nanosegundos desde el 1970-01-01 . Muy preciso. En BigInt . | 1749299400000000000n |
.offsetNanoseconds | Desfase horario, pero en nanosegundos. | 3600000000000 |
.era | Era histórica, como "CE" o "BCE" . Útil en calendarios no gregorianos. | `` |
.eraYear | El 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étodos | Descripción |
---|---|
.add() | Añade una duración. Puede ser un Temporal.Duration , un |
.subtract() | Reduce una duración. Puede ser un Temporal.Duration , 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
Métodos | Descripció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étodos | Descripción |
---|---|
.round() | Redondea la fecha, eliminando detalles que no son necesarios. |
.with() | Crea una nueva fecha cambiando los campos indicados en el |
.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étodos | Descripción |
---|---|
.toInstant() | Convierte una fecha en un momento o instante exacto. |
.toJSON() | Convierte una fecha en un |
.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 .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étodos | Descripció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.