JavaScript объект Temporal.ZonedDateTime
Определение и применение
Temporal.ZonedDateTime представляет момент времени вместе с часовым поясом и календарём. Он подходит для событий, у которых важно местное время: например, встречи завтра в 12:00 в Берлине.
Поддержка браузерами
Спецификация: proposal-temporal
Нет поддержки: Safari iOS, Samsung Android, WebView iOS.
Отдельные значения (51) поддерживаются не везде — смотрите таблицу.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
ZonedDateTime | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
new ZonedDateTime() | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
add | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
calendarId | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
compare | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
day | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
dayOfWeek | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
dayOfYear | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
daysInMonth | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
daysInWeek | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
daysInYear | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
epochMilliseconds | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
epochNanoseconds | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
equals | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
era | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
eraYear | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
from | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
getTimeZoneTransition | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
hour | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
hoursInDay | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
inLeapYear | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
microsecond | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
millisecond | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
minute | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
month | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
monthCode | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
monthsInYear | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
nanosecond | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
offset | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
offsetNanoseconds | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
round | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
second | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
since | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
startOfDay | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
subtract | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
timeZoneId | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toInstant | 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 | |||
toPlainDate | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toPlainDateTime | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toPlainTime | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toString | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
until | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
valueOf | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
weekOfYear | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
with | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
withCalendar | 144 | 144 | 139 Версия 139 выпущена в 2025 г. — Частичная поддержка Примечание MDN (англ.) Calendars | 128 | preview | 144 | 139 Версия 139 выпущена в 2025 г. — Частичная поддержка Примечание MDN (англ.) Calendars | 95 | 144 | |||
withPlainTime | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
withTimeZone | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
year | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
yearOfWeek | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
Temporal.ZonedDateTime.from(item, options);
new Temporal.ZonedDateTime(epochNanoseconds, timeZone, calendar);Для строки или набора полей удобнее from(). Конструктор принимает точный момент в наносекундах.
Значения параметров
| Параметр | Описание |
|---|---|
item | Строка с часовым поясом в квадратных скобках, объект полей или другой ZonedDateTime. Обязателен для from(). |
options | Необязательные настройки disambiguation, overflow и offset. |
epochNanoseconds | Число наносекунд от Unix-эпохи, тип bigint. Обязательно для конструктора. |
timeZone | Часовой пояс, например Europe/Berlin. Обязателен для конструктора. |
calendar | Календарь; по умолчанию iso8601. |
Спецификация
ECMAScript: Temporal.ZonedDateTime.
Возвращаемое значение и особенности
Создаётся новый Temporal.ZonedDateTime. Метод withTimeZone() сохраняет момент, меняя местное представление. Метод toInstant() возвращает этот момент без часового пояса.
Некорректная строка или часовой пояс вызывают RangeError. При disambiguation: 'reject' эта ошибка возникает и для неоднозначного местного времени.
Сутки и точная длительность
add({ days: 1 }) прибавляет календарный день, а add({ hours: 24 }) — точную длительность. При переводе часов результаты могут различаться.
Неоднозначное местное время
При переводе часов время может отсутствовать или повторяться. Параметр disambiguation задаёт выбор: earlier или later. Режим reject выдаёт ошибку; стандартный compatible выбирает более поздний вариант для пропуска и более ранний для повторения. В демонстрации сначала выбран reject, чтобы неоднозначность была заметна.
Свойства Temporal.ZonedDateTime
| Свойство | Описание |
|---|---|
Temporal.ZonedDateTime.prototype | Прототип экземпляров, содержащий их методы и свойства. |
Temporal.ZonedDateTime.length | Число обязательных параметров конструктора: 2. |
Temporal.ZonedDateTime.name | Строка "ZonedDateTime". |
Temporal.ZonedDateTime.prototype.constructor | Ссылка на конструктор Temporal.ZonedDateTime. |
Temporal.ZonedDateTime.prototype[Symbol.toStringTag] | Строка "Temporal.ZonedDateTime"; её выводит Object.prototype.toString(). |
Свойства экземпляра
Свойства доступны только для чтения: чтобы изменить значение, создайте новое через with() или арифметику.
| Свойство | Описание |
|---|---|
timeZoneId | Идентификатор часового пояса, например "Europe/Berlin". |
calendarId | Идентификатор календаря, например "iso8601". |
era | Эра календаря или undefined, если в календаре нет эр (как в ISO 8601). |
eraYear | Год внутри эры или undefined, если в календаре нет эр. |
year | Год; для ISO 8601 — астрономический год (1 г. до н. э. — это 0). |
month | Порядковый номер месяца в году, начиная с 1. |
monthCode | Код месяца, например "M02"; однозначен и для календарей с високосными месяцами. |
day | День месяца, начиная с 1. |
hour | Час: от 0 до 23. |
minute | Минуты: от 0 до 59. |
second | Секунды: от 0 до 59. |
millisecond | Миллисекунды: от 0 до 999. |
microsecond | Микросекунды: от 0 до 999. |
nanosecond | Наносекунды: от 0 до 999. |
epochMilliseconds | Момент в миллисекундах от Unix-эпохи, как у Date.prototype.getTime(). |
epochNanoseconds | Момент в наносекундах от Unix-эпохи, тип bigint. |
offset | Смещение UTC строкой, например "+02:00". |
offsetNanoseconds | Смещение UTC в наносекундах. |
hoursInDay | Длина текущих суток в часах в этом часовом поясе: обычно 24, в день перевода часов — 23 или 25. |
dayOfWeek | День недели: от 1 (понедельник) до 7 (воскресенье). |
dayOfYear | Порядковый номер дня в году, начиная с 1. |
weekOfYear | Номер недели в году по ISO 8601 или undefined для календарей без недель. |
yearOfWeek | Год, к которому относится неделя weekOfYear; в конце декабря и начале января может отличаться от year. |
daysInWeek | Число дней в неделе; для ISO 8601 — 7. |
daysInMonth | Число дней в месяце. |
daysInYear | Число дней в году: 365 или 366 для ISO 8601. |
monthsInYear | Число месяцев в году; для ISO 8601 — 12. |
inLeapYear | true, если год високосный. |
Методы Temporal.ZonedDateTime
Статические методы
| Метод | Описание |
|---|---|
Temporal.ZonedDateTime.from(item, options) | Создаёт значение из строки с часовым поясом в квадратных скобках, объекта полей или другого ZonedDateTime. |
Temporal.ZonedDateTime.compare(one, two) | Сравнивает точные моменты: -1, 0 или 1. Подходит для Array.prototype.sort(). |
Методы экземпляра
Методы не изменяют исходный объект: вычисления возвращают новое значение.
| Метод | Описание |
|---|---|
with(fields, options) | Новое значение с заменёнными полями даты и времени; параметры disambiguation, offset и overflow. |
withPlainTime(time) | Новое значение с тем же днём и другим временем; без аргумента — начало суток. |
withTimeZone(timeZone) | Тот же момент в другом часовом поясе. |
withCalendar(calendar) | То же значение в другом календаре. |
add(duration, options) | Новое значение, сдвинутое вперёд на длительность. Дни и большие единицы считаются по календарю, часы и меньшие — точно. |
subtract(duration, options) | Новое значение, сдвинутое назад на длительность. Дни и большие единицы считаются по календарю, часы и меньшие — точно. |
until(other, options) | Duration от этого значения до other; параметры largestUnit, smallestUnit и округление. |
since(other, options) | Длительность от other до этого значения; обратная операция к until(). |
round(options) | Новое значение, округлённое до единицы smallestUnit (от day до nanosecond). |
equals(other) | true, если совпадают момент, часовой пояс и календарь. |
startOfDay() | Начало текущих суток в этом часовом поясе; в некоторых поясах это не 00:00. |
getTimeZoneTransition(direction) | Ближайший перевод часов "next" или "previous"; null, если переходов нет. |
toInstant() | Instant того же момента без часового пояса. |
toPlainDate() | PlainDate с местной датой. |
toPlainTime() | PlainTime с местным временем. |
toPlainDateTime() | PlainDateTime с местной датой и временем без часового пояса. |
toString(options) | Строка ISO 8601. Параметры задают точность и вывод частей записи. |
toJSON() | То же, что toString() без параметров; вызывается в JSON.stringify(). |
toLocaleString(locales, options) | Строка для пользователя с учётом языка, как у Intl.DateTimeFormat. |
valueOf() | Всегда выдаёт TypeError: операторы <, > и + к Temporal не применяются. Используйте compare() или equals(). |
Примеры, попробуйте сами
Один момент в двух часовых поясах
Измените дату и часовой пояс. Сравните местное время и результат toInstant().
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
if (typeof Temporal === 'undefined') {
console.log('Этот браузер пока не поддерживает Temporal.')
} else {
const meeting = Temporal.ZonedDateTime.from('2026-03-28T12:00[Europe/Berlin]')
const tokyo = meeting.withTimeZone('Asia/Tokyo')
console.log('Берлин:', meeting.toString())
console.log('Токио:', tokyo.toString())
console.log('Момент в UTC:', meeting.toInstant().toString())
console.log('Момент совпадает:', meeting.epochNanoseconds === tokyo.epochNanoseconds)
}
Сутки или 24 часа: интерактивная демонстрация
Выберите пример или свою дату. Сравните местное время, UTC и прошедшие часы, затем изучите полученный код. Демонстрация проверяет поддержку Temporal в вашем браузере.
Календарные сутки сохраняют местное время следующего дня, если оно существует. 24 часа задают точную длительность. При переводе часов результаты могут различаться. Например, от полудня 28 марта до полудня 29 марта 2026 года в Берлине проходит 23 часа.
Проверяем поддержку Temporal…
compatible выбирает ранний вариант при повторении времени и сдвигает вперёд при пропуске. При прибавлении календарных суток Temporal использует совместимое разрешение; настройка выше относится к исходному времени.
Выберите пример или введите дату.
| Вариант | Дата со смещением и поясом | UTC | Прошло часов |
|---|---|---|---|
| Начало | |||
| +1 календарный день | |||
| +24 часа |
| Пояс | Местная дата и время |
|---|
Код с нативным Temporal
Для интерактивного сравнения включите JavaScript и используйте браузер с Temporal. При осеннем переводе часов календарные сутки могут длиться 25 часов.
Связанные материалы
См. также объект Date, конвертер Unix timestamp и документацию Temporal.ZonedDateTime.