Mediante la nueva API Temporal se pueden crear fechas, pero además también es posible crear duraciones, que representan un intervalo de tiempo.
El formato es el siguiente:
P_Y_M_DT_H_M_S
- 1️⃣
P
(Period) es la primera letra para identificar una duración. - 2️⃣
Y
para indicar una unidad de años. - 3️⃣
M
para indicar una unidad de meses. - 4️⃣
D
para indicar una unidad de días. - 5️⃣
T
para establecer un separador para la parte de horas. - 6️⃣
H
para indicar una unidad de horas. - 7️⃣
M
para indicar una unidad de minutos. - 8️⃣
S
para indicar una unidad de segundos.
La API Temporal
con duraciones
La forma de crear duraciones de tiempo es mediante el método .from()
, aunque también tenemos el método .compare()
para comparar dos duraciones.
Partes de la API | Descripción |
---|---|
Temporal.Duration.from() | Crea una duración a partir de un Temporal.Duration . |
Temporal.Duration.compare() | Compara dos duraciones y devuelve -1 , 0 o 1 , dependiendo de si es menor, igual o mayor. |
Veamos como se utilizan:
Mediante el método .from()
podemos crear duraciones, pudiendo utilizar formas diferentes:
// Crear a partir de un string
Temporal.Duration.from("P3Y5MT3H30M");
Temporal.Duration.from("PT4H25M");
// Crear a partir de un objeto
Temporal.Duration.from({ hours: 4, minutes: 30 });
También se puede crear una duración, en lugar de con un Temporal.Duration
, donde se crea una copia.
El método .compare()
nos permite comparar dos duraciones y obtener un valor numérico que indica si la primera duración es más pequeña que la segunda (-1), si es igual (0) o si la primera duración es más grande que la segunda (1):
const t1 = Temporal.Duration.from("PT1H30M");
const t2 = Temporal.Duration.from("PT5H30M");
Temporal.Duration.compare(t1, t2); // -1
Temporal.Duration.compare(t1, t1); // 0
Temporal.Duration.compare(t2, t1); // 1
Obtener partes de la duración
Al igual que en la API Temporal de fechas, podemos utilizar una serie de propiedades en la duración creada, con la finalidad de obtener información de la duración:
Propiedades | Descripción |
---|---|
.blank | Devuelve true si la duración está en blanco o es cero. |
.years / .weeks / .months / .days | Cantidad de años/semanas/meses/días en la duración. |
.hours / .minutes / .seconds | Cantidad de horas/minutos/segundos en la duración. |
.milliseconds / .microseconds / .nanoseconds | Cantidad de milisegundos/microsegundos/nanosegundos en la duración. |
.sign | Devuelve -1 si la duración es negativa y 1 si es positiva. |
Un detalle es que
{ days: 2, hours: 25, minutes: 15 }
no calcula que son3
días (25
supera las24
horas). Para ello, tendríamos que usar.round("minutes")
, un método que veremos más adelante.
Operaciones con duraciones
Una vez conocemos todos los detalles anteriores, vamos a ver que métodos podemos utilizar para realizar operaciones con nuestras duraciones.
Mediante los siguientes métodos podemos realizar operaciones con nuestras duraciones. Por ejemplo, utilizar .add()
para sumar una duración o .subtract()
para restar una duración:
Métodos | Descripción |
---|---|
.add() | Suma otra duración a la duración de tiempo actual. |
.subtract() | Resta otra duración a la duración de tiempo actual. |
En ambos casos, devuelve un objeto de duración Temporal
.
Mediante los siguientes métodos podemos realizar ajustes sobre una duración concreta. Por ejemplo, los métodos .abs()
y .negated()
se encargan de trabajar con el signo de la duración:
Métodos | Descripción |
---|---|
.abs() | Devuelve la versión positiva de la duración de tiempo. |
.negated() | Invierte el signo de la duración de tiempo actual. |
.round() | Simplifica o redondea la duración usando la unidad especificada como unidad mínima. |
.total() | Devuelve el total de la duración en una sola unidad. |
.with() | Crea una copia de la duración con unidades reemplazadas. |
Por otro lado, el método .round()
nos permite, no sólo redondear una duración a la unidad mínima indicada, sino también a revisar y simplificar las duraciones:
Temporal.Duration.from("PT4H30M15S").round("minutes"); // PT4H30M
Temporal.Duration.from("PT4H30M15S").round("hours"); // PT5H
Temporal.Duration.from("P2DT25H30M"); // P2DT25H30M
Temporal.Duration.from("P2DT25H30M").round("minutes"); // P3DT1H30M
El método .total()
nos permite obtener el total de duración en una sola unidad:
Temporal.Duration.from("P2DT25H30M").total("hours"); // 73.5
Temporal.Duration.from("P2DT25H30M").total("minutes"); // 4410
Temporal.Duration.from("P2DT25H30M").total("days"); // 3.0625
Por último, mediante el método .with()
podemos hacer reemplazos en unidades de la duración:
Temporal.Duration.from("P2DT25H30M").with({ minutes: 15 }); // P2DT25H15M
Temporal.Duration.from("P2DT25H30M").with({ hours: 48 }); // P2DT48H30M
Por último, tenemos algunos métodos que nos permiten devolver la duración en un formato específico, como puede ser un .toLocaleString()
que lo devuelve en una versión legible más orientado a configuraciones regionales:
Métodos | Descripción |
---|---|
.toJSON() | Devuelve un |
.toLocaleString() | Devuelve un |
.toString() | Devuelve un .toJSON() . |
Formatear con Intl.DurationFormat
Ahora que ya sabemos crear duraciones de tiempo, vamos a echar un vistazo a Intl.DurationFormat
para formatear la duración en un texto adaptado a nuestro idioma o configuración regional.
Para ello, vamos a hacer lo siguiente:
// Mediante Temporal.Duration
const df = new Intl.DurationFormat("es");
const duration = Temporal.Duration.from("PT4h30m");
const text = df.format(duration); // "4 h y 30 min"
Observa que con Intl.DurationFormat()
podemos establecer una configuración regional. En nuestro caso hemos indicado "es"
por parámetro para que utilice formato español, pero de se le puede indicar otros como fr
o en
, por ejemplo. Si se deja vacío, se usa el que se tiene por defecto en la configuración regional.
Una vez creado, podemos utilizar el método .format()
y formatear la duración.
En este segundo ejemplo, indicamos un objeto de opciones al crear una configuración regional con Intl.DurationFormat()
:
// Mediante Temporal.Duration con opciones
const options = { style: "long" };
const df = new Intl.DurationFormat("es", options);
const duration = Temporal.Duration.from("PT4h30m");
const text = df.format(duration); // "4 horas y 30 minutos"
En este caso, conseguimos el mismo formato en español, pero formato largo.
En el caso de que tengamos un navegador que no tenga soporte para Temporal.Duration
, podemos utilizar un objeto simple de Javascript, como el que puedes ver a continuación:
// Mediante objeto
const df = new Intl.DurationFormat("es");
const duration = { hours: 5, minutes: 20 };
const text = df.format(duration); // "5 h y 20 min"
Sin embargo, lo ideal a largo plazo es utilizar Temporal.Duration
ya que tendríamos soporte para realizar operaciones sobre fechas y duraciones.