JavaScript объект Temporal.Duration

Определение и применение

Temporal.Duration представляет длительность: например, 90 минут, 2 недели или 1 месяц. Её прибавляют к датам и моментам, получают из until() и since(), переводят в минуты или часы.

Поддержка браузерами

Спецификация: proposal-temporal

Нет поддержки: Safari iOS, Samsung Android, WebView iOS.

Отдельные значения (26) поддерживаются не везде — смотрите таблицу.

Показать браузеры
Совместимостьjavascript.builtins.Temporal.Duration
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
Duration✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
new Duration()✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
abs✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
add✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
blank✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
compare✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
days✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
from✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
hours✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
microseconds✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
milliseconds✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
minutes✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
months✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
nanoseconds✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
negated✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
round✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
seconds✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
sign✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
subtract✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
toJSON✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
toLocaleString✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
toString✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
total✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
valueOf✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
weeks✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
with✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×
years✓144✓144✓139✓128✓preview✓144✓139✓95××✓144×

поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31

JavaScript синтаксис

JavaScript
Temporal.Duration.from(item);
new Temporal.Duration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds);

Для строки ISO 8601, такой как 'PT1H30M', или объекта { hours: 1, minutes: 30 } удобнее from(). Все аргументы конструктора необязательны.

Значения параметров

Параметры создания Temporal.Duration
ПараметрОписание
itemСтрока ISO 8601 (P1Y2M3DT4H5M6S), объект единиц или другой Duration. Обязателен для from().
yearsГоды. Необязательный параметр, по умолчанию 0.
monthsМесяцы. Необязательный параметр, по умолчанию 0.
weeksНедели. Необязательный параметр, по умолчанию 0.
daysДни. Необязательный параметр, по умолчанию 0.
hoursЧасы. Необязательный параметр, по умолчанию 0.
minutesМинуты. Необязательный параметр, по умолчанию 0.
secondsСекунды. Необязательный параметр, по умолчанию 0.
millisecondsМиллисекунды. Необязательный параметр, по умолчанию 0.
microsecondsМикросекунды. Необязательный параметр, по умолчанию 0.
nanosecondsНаносекунды. Необязательный параметр, по умолчанию 0.

Все значения — целые числа одного знака: new Temporal.Duration(0, 0, 0, 0, 1, 30) — 1 час 30 минут, new Temporal.Duration(0, 0, 0, 0, -1, -30) — минус 1 час 30 минут. Смешивать знаки и передавать дроби нельзя: возникает RangeError. В from() те же имена используются как поля объекта: { hours: 1, minutes: 30 }.

Спецификация

ECMAScript: Temporal.Duration.

Возвращаемое значение и особенности

Создаётся новый Temporal.Duration. Значения не нормализуются автоматически: PT90M остаётся 90 минутами. Метод round({ largestUnit: 'hours' }) переводит запись в часы и минуты, total({ unit: 'minutes' }) возвращает число, sign — знак длительности.

Недели, месяцы и годы — календарные единицы: длина месяца и года зависит от даты отсчёта. Для них методы round(), total() и Temporal.Duration.compare() требуют параметр relativeTo; без него возникает RangeError. Сутки без relativeTo считаются равными 24 часам.

Свойства Temporal.Duration

Свойства конструктора Temporal.Duration
СвойствоОписание
Temporal.Duration.prototypeПрототип экземпляров, содержащий их методы и свойства.
Temporal.Duration.lengthЧисло обязательных параметров конструктора: 0.
Temporal.Duration.nameСтрока "Duration".
Temporal.Duration.prototype.constructorСсылка на конструктор Temporal.Duration.
Temporal.Duration.prototype[Symbol.toStringTag]Строка "Temporal.Duration"; её выводит Object.prototype.toString().

Свойства экземпляра

Свойства доступны только для чтения: чтобы изменить значение, создайте новое через with().

Свойства экземпляра Temporal.Duration
СвойствоОписание
yearsЧисло в единице years в записи длительности, без нормализации.
monthsЧисло в единице months в записи длительности, без нормализации.
weeksЧисло в единице weeks в записи длительности, без нормализации.
daysЧисло в единице days в записи длительности, без нормализации.
hoursЧисло в единице hours в записи длительности, без нормализации.
minutesЧисло в единице minutes в записи длительности, без нормализации.
secondsЧисло в единице seconds в записи длительности, без нормализации.
millisecondsЧисло в единице milliseconds в записи длительности, без нормализации.
microsecondsЧисло в единице microseconds в записи длительности, без нормализации.
nanosecondsЧисло в единице nanoseconds в записи длительности, без нормализации.
sign1 для положительной, -1 для отрицательной и 0 для нулевой длительности.
blanktrue, если все единицы равны нулю.

Методы Temporal.Duration

Статические методы

Статические методы Temporal.Duration
МетодОписание
Temporal.Duration.from(item)Создаёт длительность из строки ISO 8601, объекта единиц или другого Duration.
Temporal.Duration.compare(one, two, options)Сравнивает длительности: -1, 0 или 1. Для недель, месяцев и лет нужен relativeTo.

Методы экземпляра

Методы не изменяют исходный объект: вычисления возвращают новое значение.

Методы экземпляра Temporal.Duration
МетодОписание
with(fields)Новая длительность с заменёнными единицами.
negated()Длительность с противоположным знаком.
abs()Длительность без знака.
add(other)Сумма длительностей. Недели, месяцы и годы складывать нельзя: прибавьте их к дате.
subtract(other)Разность длительностей; ограничения те же, что у add().
round(options)Новая запись в единицах от largestUnit до smallestUnit; для недель, месяцев и лет нужен relativeTo.
total(options)Длительность числом в единице unit, например минут; для недель, месяцев и лет нужен relativeTo.
toString(options)Строка ISO 8601, например "PT1H30M".
toJSON()То же, что toString(); вызывается в JSON.stringify().
toLocaleString(locales, options)Длительность словами через Intl.DurationFormat, если браузер его поддерживает.
valueOf()Всегда выдаёт TypeError: для сравнения используйте Temporal.Duration.compare().

Примеры, попробуйте сами

Минуты, часы и сумма длительностей

Измените длительность занятия. Сравните исходную запись, результат round() и число минут из total().

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
if (typeof Temporal === 'undefined') {
    console.log('Этот браузер пока не поддерживает Temporal.')
} else {
    const lesson = Temporal.Duration.from('PT90M')
    console.log('Исходная запись:', lesson.toString())
    console.log('В часах и минутах:', lesson.round({ largestUnit: 'hours' }).toString())
    console.log('Всего минут:', lesson.total({ unit: 'minutes' }))
    const course = lesson.add({ minutes: 45 }).add({ hours: 2 })
    console.log('Курс:', course.round({ largestUnit: 'hours' }).toLocaleString('ru-RU', { style: 'long' }))
    console.log('Отрицательная:', lesson.negated().toString(), lesson.negated().sign)
}

Метод toLocaleString() выводит длительность словами, если браузер поддерживает Intl.DurationFormat.

Сколько дней в месяце: relativeTo

Измените дату отсчёта на високосный февраль. Затем сравните 24 часа и сутки в день перевода часов.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
if (typeof Temporal === 'undefined') {
    console.log('Этот браузер пока не поддерживает Temporal.')
} else {
    const month = Temporal.Duration.from({ months: 1 })
    console.log('Февраль:', month.total({ unit: 'days', relativeTo: '2026-02-01' }), 'дн.')
    console.log('Март:', month.total({ unit: 'days', relativeTo: '2026-03-01' }), 'дн.')
    // Без relativeTo длина месяца неизвестна.
    try {
        month.total({ unit: 'days' })
    } catch (error) {
        console.log('Без relativeTo:', error.name)
    }
    const a = Temporal.Duration.from({ hours: 25 })
    const b = Temporal.Duration.from({ days: 1 })
    console.log('25 ч длиннее суток:', Temporal.Duration.compare(a, b, { relativeTo: '2026-03-28T12:00[Europe/Berlin]' }) > 0)
}

Если relativeTo — ZonedDateTime, учитываются переводы часов: 29 марта 2026 года в Берлине сутки длятся 23 часа.

См. также обзор Temporal, Temporal.PlainDate, Temporal.Instant и документацию Temporal.Duration.