Класс Duration из библиотеки js-joda
предназначен для работы с временными интервалами, измеряемыми в секундах
и наносекундах. В отличие от календарных сущностей (Period,
LocalDate, YearMonth), Duration
оперирует точным количеством времени.
Duration используется в сценариях:
Duration является неизменяемым объектом (immutable).
Любая операция создаёт новый экземпляр.
const { Duration } = require('@js-joda/core');
Для ES-модулей:
import { Duration } from '@js-joda/core';
Durationconst duration = Duration.ofSeconds(120);
console.log(duration.toString());
Результат:
PT2M
Формат PT2M соответствует стандарту ISO-8601:
P — период;T — начало временной части;2M — две минуты.const duration = Duration.ofMinutes(15);
const duration = Duration.ofHours(5);
const duration = Duration.ofDays(2);
Важно понимать: один день в Duration всегда равен ровно
24 часам.
Duration.ofDays(1)
эквивалентно:
Duration.ofHours(24)
const duration = Duration.ofMillis(1500);
const duration = Duration.ofNanos(500000000);
parseDuration поддерживает ISO-8601 строковый формат.
const duration = Duration.parse('PT2H30M');
Значение:
2H — два часа;30M — тридцать минут.| Строка | Значение |
|---|---|
PT20S |
20 секунд |
PT15M |
15 минут |
PT10H |
10 часов |
P2DT3H |
2 дня и 3 часа |
PT0.5S |
полсекунды |
const duration = Duration.ofMinutes(2);
console.log(duration.seconds());
Результат:
120
const duration = Duration.ofSeconds(1, 500000000);
console.log(duration.nano());
Результат:
500000000
betweenМетод between вычисляет разницу между двумя временными
объектами.
const {
LocalTime,
Duration
} = require('@js-joda/core');
const start = LocalTime.parse('10:00');
const end = LocalTime.parse('12:45');
const duration = Duration.between(start, end);
console.log(duration.toString());
Результат:
PT2H45M
Period и DurationDurationРаботает с:
Основан на точном времени.
PeriodРаботает с:
Основан на календарной модели.
Duration.ofDays(1)
всегда:
24 часа
Но:
Period.ofDays(1)
может означать календарный день с переходом:
const duration =
Duration.ofHours(2)
.plusMinutes(30);
console.log(duration.toString());
Результат:
PT2H30M
const duration =
Duration.ofHours(5)
.minusHours(2);
console.log(duration.toString());
Результат:
PT3H
const duration =
Duration.ofMinutes(10)
.multipliedBy(3);
console.log(duration.toString());
Результат:
PT30M
const duration =
Duration.ofHours(4)
.dividedBy(2);
console.log(duration.toString());
Результат:
PT2H
const duration =
Duration.ofMinutes(10)
.minusMinutes(20);
console.log(duration.toString());
Результат:
PT-10M
duration.isNegative()
duration.isZero()
const duration = Duration.ofSeconds(0);
console.log(duration.isZero());
Результат:
true
const duration = Duration.ofMinutes(-30);
console.log(duration.abs().toString());
Результат:
PT30M
LocalDateTimeconst {
LocalDateTime,
Duration
} = require('@js-joda/core');
const dateTime =
LocalDateTime.parse('2025-01-10T12:00');
const result =
dateTime.plus(Duration.ofHours(5));
console.log(result.toString());
Результат:
2025-01-10T17:00
const result =
dateTime.minus(Duration.ofMinutes(90));
InstantInstant особенно часто используется вместе с
Duration.
const {
Instant,
Duration
} = require('@js-joda/core');
const start = Instant.now();
// операция
const end = Instant.now();
const executionTime =
Duration.between(start, end);
console.log(executionTime.toMillis());
duration.toMillis()
duration.toNanos()
const duration = Duration.ofSeconds(2);
console.log(duration.toMillis());
Результат:
2000
compareToconst d1 = Duration.ofMinutes(10);
const d2 = Duration.ofMinutes(20);
console.log(d1.compareTo(d2));
Результат:
-1
d1.equals(d2)
При создании Duration библиотека автоматически
нормализует данные.
const duration =
Duration.ofSeconds(90);
console.log(duration.toString());
Результат:
PT1M30S
Duration хранит:
Это позволяет получать очень высокую точность вычислений.
const duration =
Duration.ofSeconds(1, 1);
console.log(duration.nano());
Результат:
1
const timeout =
Duration.ofSeconds(30);
const polling =
Duration.ofMillis(500);
const {
Instant,
Duration
} = require('@js-joda/core');
const start = Instant.now();
for (let i = 0; i < 1000000; i++) {
Math.sqrt(i);
}
const end = Instant.now();
const elapsed =
Duration.between(start, end);
console.log(elapsed.toMillis());
const duration =
Duration.parse('PT1.5S');
console.log(duration.toMillis());
Результат:
1500
Duration не содержит информации о часовом поясе.
Он представляет только физический промежуток времени.
const duration = Duration.ofHours(1);
Этот интервал всегда равен:
3600 секунд
независимо от:
Очень большие интервалы могут вызывать переполнение.
Duration.ofSeconds(Number.MAX_SAFE_INTEGER)
При работе с крупными значениями необходимо учитывать ограничения JavaScript-чисел.
| Метод | Назначение |
|---|---|
ofSeconds() |
создание из секунд |
ofMinutes() |
создание из минут |
ofHours() |
создание из часов |
ofDays() |
создание из дней |
parse() |
создание из ISO-8601 |
between() |
разница между моментами |
plus() |
добавление |
minus() |
вычитание |
multipliedBy() |
умножение |
dividedBy() |
деление |
toMillis() |
миллисекунды |
toNanos() |
наносекунды |
isZero() |
проверка на ноль |
isNegative() |
проверка знака |
abs() |
модуль |
const {
Instant,
Duration
} = require('@js-joda/core');
const issuedAt = Instant.now();
const ttl = Duration.ofMinutes(15);
const expiresAt = issuedAt.plus(ttl);
console.log(expiresAt.toString());
const now = Instant.now();
const expired =
now.isAfter(expiresAt);
console.log(expired);
const interval =
Duration.ofSeconds(1);
const lastRequest =
Instant.now();
const nextAllowed =
lastRequest.plus(interval);
const retryDelay =
Duration.ofSeconds(5);
const retryTime =
Instant.now().plus(retryDelay);
Duration.ofMinutes(90).toString()
Результат:
PT1H30M
Duration.ofDays(3).toString()
Результат:
PT72H
Важно: Duration хранит дни как часы, а не как
календарные сутки.
DateDateDurationZonedDateTimeconst {
ZonedDateTime,
ZoneId,
Duration
} = require('@js-joda/core');
const zoned =
ZonedDateTime.now(
ZoneId.of('Europe/Moscow')
);
const future =
zoned.plus(Duration.ofHours(3));
console.log(future.toString());
const start = Instant.now();
// операция
const duration =
Duration.between(
start,
Instant.now()
);
if (duration.toMillis() > 1000) {
console.log('Слишком долго');
}
Duration хранит:
Структура аналогична Java API java.time.Duration, на
основе которого построен js-joda.
DurationDuration подходит для:
Duration использовать не следуетDuration плохо подходит для:
Для таких задач используется Period.