JavaScript объект Temporal

Temporal — встроенное пространство имён для работы с датами и временем. Как и Math, сам объект не вызывается через new: используйте его типы и методы.

Выбирайте тип по данным задачи: календарная дата (PlainDate — например, дата рождения без времени и часового пояса), точный момент (Instant — например, время получения запроса сервером) и местное время с часовым поясом (ZonedDateTime — например, встреча 27 октября 2026 года в 12:00 по времени Берлина) имеют разный смысл. Объекты Temporal неизменяемы: вычисления возвращают новый объект (например, date.add({ days: 1 }) создаёт следующую дату, сохраняя исходную date).

Типы и объекты Temporal

Какой тип выбрать
ТипНазначение
InstantТочный момент времени.
ZonedDateTimeМомент, часовой пояс и календарь. Интерактивное сравнение суток и 24 часов.
PlainDateДата без времени и часового пояса.
PlainTimeВремя без даты и часового пояса.
PlainDateTimeДата и время без часового пояса.
PlainYearMonthГод и месяц.
PlainMonthDayМесяц и день.
DurationДлительность для вычислений.
NowМетоды получения текущего времени.

Свойства Temporal

Свойства Temporal
СвойствоОписание
Temporal[Symbol.toStringTag]Строка "Temporal"; её выводит Object.prototype.toString().

Создание значений

Для разбора строки используйте метод from() нужного типа, например Temporal.PlainDate.from('2026-10-27'). Текущий момент возвращает Temporal.Now.instant(). Методы экземпляра, такие как add() и toString(), вызываются у созданного значения.

Поддержка зависит от браузера и конкретного типа. Таблица для работы с часовыми поясами приведена в статье Temporal.ZonedDateTime.

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

ECMAScript: Temporal.

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

Календарная дата и неизменяемость

Измените дату и число дней. Сравните результат add() с исходным объектом.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
if (typeof Temporal === 'undefined') {
    console.log('Этот браузер пока не поддерживает Temporal.')
} else {
    const date = Temporal.PlainDate.from('2026-10-27')
    const next = date.add({ days: 1 })
    console.log('Исходная дата:', date.toString())
    console.log('После прибавления:', next.toString())
    console.log('Исходная дата не изменилась:', date.toString())
}

Сколько ночей в бронировании

Заезд и выезд — календарные даты. Здесь не нужно делить миллисекунды на 24 часа. Измените даты, затем попробуйте выезд раньше заезда.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
if (typeof Temporal === 'undefined') {
    console.log('Этот браузер пока не поддерживает Temporal.')
} else {
    // Значения могут приходить из двух полей input type="date".
    const arrival = Temporal.PlainDate.from('2026-03-28')
    const departure = Temporal.PlainDate.from('2026-03-30')
    if (Temporal.PlainDate.compare(departure, arrival) <= 0) {
        console.log('Дата выезда должна быть позже даты заезда.')
    } else {
        const stay = arrival.until(departure)
        console.log('Ночей:', stay.days)
        console.log('Длительность ISO:', stay.toString())
    }
}

Метод PlainDate.until() возвращает длительность. День выезда не считается отдельной ночью.

Подписка с датой списания 31-го числа

Сравните прибавление месяцев по цепочке и от исходной даты. Поменяйте год на високосный и проверьте строгий режим overflow: reject.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
if (typeof Temporal === 'undefined') {
    console.log('Этот браузер пока не поддерживает Temporal.')
} else {
    const start = Temporal.PlainDate.from('2026-01-31')
    const february = start.add({ months: 1 })
    console.log('Следующий месяц:', february.toString())
    console.log('Ещё месяц от февраля:', february.add({ months: 1 }).toString())
    console.log('Два месяца от начала:', start.add({ months: 2 }).toString())
    // Политика приложения: отклонить отсутствующий день вместо ограничения.
    try {
        console.log(start.add({ months: 1 }, { overflow: 'reject' }).toString())
    } catch (error) {
        console.log('Строгий режим:', error.name)
    }
}

По умолчанию add() ограничивает день последним допустимым числом месяца. Расписание от исходной даты и последовательное прибавление могут различаться; правило списаний задаёт приложение.

Сортировка событий с разными UTC-смещениями

Строки ISO с разными смещениями не обязательно идут в порядке событий. Измените смещения и сравните строковую сортировку с Temporal.Instant.compare().

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
if (typeof Temporal === 'undefined') {
    console.log('Этот браузер пока не поддерживает Temporal.')
} else {
    const events = [
        { id: 'A', at: '2026-10-27T09:00:00+03:00' },
        { id: 'B', at: '2026-10-27T08:00:00Z' },
        { id: 'C', at: '2026-10-27T07:00:00+02:00' },
    ]
    const strings = [...events].sort((a, b) => a.at.localeCompare(b.at))
    const moments = [...events].sort((a, b) => Temporal.Instant.compare(a.at, b.at))
    console.log('По строкам:', strings.map(event => event.id).join(', '))
    console.log('По моментам:', moments.map(event => event.id).join(', '))
    for (const event of moments) {
        console.log(event.id, Temporal.Instant.from(event.at).toString())
    }
}

Метод Instant.compare() сравнивает точные моменты. Другие сценарии собраны в Temporal Cookbook.