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[Symbol.toStringTag] | Строка "Temporal"; её выводит Object.prototype.toString(). |
Создание значений
Для разбора строки используйте метод from() нужного типа, например Temporal.PlainDate.from('2026-10-27'). Текущий момент возвращает Temporal.Now.instant(). Методы экземпляра, такие как add() и toString(), вызываются у созданного значения.
Поддержка зависит от браузера и конкретного типа. Таблица для работы с часовыми поясами приведена в статье Temporal.ZonedDateTime.
Спецификация
Примеры, попробуйте сами
Календарная дата и неизменяемость
Измените дату и число дней. Сравните результат add() с исходным объектом.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
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
<p>Результат выполнения выводится в консоль.</p>
main.js
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
<p>Результат выполнения выводится в консоль.</p>
main.js
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
<p>Результат выполнения выводится в консоль.</p>
main.js
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.