JavaScript объект Temporal.Duration
Определение и применение
Temporal.Duration представляет длительность: например, 90 минут, 2 недели или 1 месяц. Её прибавляют к датам и моментам, получают из until() и since(), переводят в минуты или часы.
Поддержка браузерами
Спецификация: proposal-temporal
Нет поддержки: Safari iOS, Samsung Android, WebView iOS.
Отдельные значения (26) поддерживаются не везде — смотрите таблицу.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 синтаксис
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(). Все аргументы конструктора необязательны.
Значения параметров
| Параметр | Описание |
|---|---|
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.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().
| Свойство | Описание |
|---|---|
years | Число в единице years в записи длительности, без нормализации. |
months | Число в единице months в записи длительности, без нормализации. |
weeks | Число в единице weeks в записи длительности, без нормализации. |
days | Число в единице days в записи длительности, без нормализации. |
hours | Число в единице hours в записи длительности, без нормализации. |
minutes | Число в единице minutes в записи длительности, без нормализации. |
seconds | Число в единице seconds в записи длительности, без нормализации. |
milliseconds | Число в единице milliseconds в записи длительности, без нормализации. |
microseconds | Число в единице microseconds в записи длительности, без нормализации. |
nanoseconds | Число в единице nanoseconds в записи длительности, без нормализации. |
sign | 1 для положительной, -1 для отрицательной и 0 для нулевой длительности. |
blank | true, если все единицы равны нулю. |
Методы Temporal.Duration
Статические методы
| Метод | Описание |
|---|---|
Temporal.Duration.from(item) | Создаёт длительность из строки ISO 8601, объекта единиц или другого Duration. |
Temporal.Duration.compare(one, two, options) | Сравнивает длительности: -1, 0 или 1. Для недель, месяцев и лет нужен relativeTo. |
Методы экземпляра
Методы не изменяют исходный объект: вычисления возвращают новое значение.
| Метод | Описание |
|---|---|
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
<p>Результат выполнения выводится в консоль.</p>
main.js
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
<p>Результат выполнения выводится в консоль.</p>
main.js
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.