JavaScript объект Temporal.PlainDate
Определение и применение
Temporal.PlainDate представляет календарную дату без времени и часового пояса. Он подходит для дат рождения, праздников, дат заезда и сроков «до 31 декабря»: такая дата одинакова в любом часовом поясе.
Поддержка браузерами
Спецификация: proposal-temporal
Нет поддержки: Safari iOS, Samsung Android, WebView iOS.
Отдельные значения (34) поддерживаются не везде — смотрите таблицу.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
PlainDate | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
new PlainDate() | 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 | |||
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 | |||
inLeapYear | 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 | |||
since | 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 | |||
toPlainDateTime | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toPlainMonthDay | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toPlainYearMonth | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toString | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
toZonedDateTime | 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 | |||
year | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
yearOfWeek | 144 | 144 | 139 | 128 | preview | 144 | 139 | 95 | 144 | |||
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
Temporal.PlainDate.from(item, options);
new Temporal.PlainDate(year, month, day, calendar);Для строки '2026-10-27' или объекта полей удобнее from(). Конструктор принимает числа и всегда отклоняет несуществующую дату.
Значения параметров
| Параметр | Описание |
|---|---|
item | Строка ISO 8601, объект полей { year, month, day } или другой PlainDate. Обязателен для from(). |
options | Необязательный параметр overflow: 'constrain' (по умолчанию) ограничивает день допустимым значением, 'reject' выдаёт ошибку. |
year, month, day | Год, месяц (от 1 до 12) и день. Обязательны для конструктора. |
calendar | Календарь; по умолчанию iso8601. |
Спецификация
ECMAScript: Temporal.PlainDate.
Возвращаемое значение и особенности
Создаётся новый Temporal.PlainDate. Свойства year, month, day, dayOfWeek, daysInMonth и inLeapYear доступны только для чтения. Методы add(), subtract() и with() возвращают новую дату, а until() и since() — Temporal.Duration.
Месяцы в Temporal нумеруются с 1, в отличие от Date.prototype.getMonth(). Некорректная строка вызывает RangeError. Сравнивать даты операторами < и > нельзя: используйте Temporal.PlainDate.compare() или equals().
Свойства Temporal.PlainDate
| Свойство | Описание |
|---|---|
Temporal.PlainDate.prototype | Прототип экземпляров, содержащий их методы и свойства. |
Temporal.PlainDate.length | Число обязательных параметров конструктора: 3. |
Temporal.PlainDate.name | Строка "PlainDate". |
Temporal.PlainDate.prototype.constructor | Ссылка на конструктор Temporal.PlainDate. |
Temporal.PlainDate.prototype[Symbol.toStringTag] | Строка "Temporal.PlainDate"; её выводит Object.prototype.toString(). |
Свойства экземпляра
Свойства доступны только для чтения: чтобы изменить значение, создайте новое через with() или арифметику.
| Свойство | Описание |
|---|---|
calendarId | Идентификатор календаря, например "iso8601". |
era | Эра календаря или undefined, если в календаре нет эр (как в ISO 8601). |
eraYear | Год внутри эры или undefined, если в календаре нет эр. |
year | Год; для ISO 8601 — астрономический год (1 г. до н. э. — это 0). |
month | Порядковый номер месяца в году, начиная с 1. |
monthCode | Код месяца, например "M02"; однозначен и для календарей с високосными месяцами. |
day | День месяца, начиная с 1. |
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.PlainDate
Статические методы
| Метод | Описание |
|---|---|
Temporal.PlainDate.from(item, options) | Создаёт дату из строки ISO 8601, объекта полей или другого значения Temporal с датой. |
Temporal.PlainDate.compare(one, two) | Сравнивает даты: -1, 0 или 1. Подходит для Array.prototype.sort(). |
Методы экземпляра
Методы не изменяют исходный объект: вычисления возвращают новое значение.
| Метод | Описание |
|---|---|
with(fields, options) | Новая дата с заменёнными полями, например with({ day: 1 }); параметр overflow. |
withCalendar(calendar) | Та же дата в другом календаре. |
add(duration, options) | Новое значение, сдвинутое вперёд на длительность. Принимает годы, месяцы, недели и дни; параметр overflow задаёт поведение для несуществующего дня. |
subtract(duration, options) | Новое значение, сдвинутое назад на длительность. Принимает годы, месяцы, недели и дни; параметр overflow задаёт поведение для несуществующего дня. |
until(other, options) | Duration от этого значения до other; параметры largestUnit, smallestUnit и округление. |
since(other, options) | Длительность от other до этого значения; обратная операция к until(). |
equals(other) | true, если совпадают дата и календарь. |
toPlainDateTime(time) | PlainDateTime с этой датой и указанным временем; без аргумента — полночь. |
toZonedDateTime(options) | ZonedDateTime в часовом поясе; строка пояса или объект { timeZone, plainTime }. |
toPlainYearMonth() | PlainYearMonth с годом и месяцем этой даты. |
toPlainMonthDay() | PlainMonthDay с месяцем и днём этой даты. |
toString(options) | Строка ISO 8601. Параметры задают точность и вывод частей записи. |
toJSON() | То же, что toString() без параметров; вызывается в JSON.stringify(). |
toLocaleString(locales, options) | Строка для пользователя с учётом языка, как у Intl.DateTimeFormat. |
valueOf() | Всегда выдаёт TypeError: операторы <, > и + к Temporal не применяются. Используйте compare() или equals(). |
Примеры, попробуйте сами
Возраст и следующий день рождения
Измените дату рождения на 29 февраля високосного года. Посмотрите, как with() ограничивает день в обычном году.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
if (typeof Temporal === 'undefined') {
console.log('Этот браузер пока не поддерживает Temporal.')
} else {
const birthday = Temporal.PlainDate.from('1990-02-28')
const today = Temporal.PlainDate.from('2026-10-27')
const age = birthday.until(today, { largestUnit: 'years' })
console.log('Возраст:', age.years, 'лет', age.months, 'мес.', age.days, 'дн.')
const next = birthday.with({ year: today.year })
const upcoming = Temporal.PlainDate.compare(next, today) < 0 ? next.add({ years: 1 }) : next
console.log('Следующий день рождения:', upcoming.toString())
console.log('Осталось дней:', today.until(upcoming).days)
}
Параметр largestUnit: 'years' разбивает разницу на годы, месяцы и дни. Без него until() возвращает только дни.
Поля даты и границы месяца
Измените год и месяц. Сравните число дней в месяце и признак високосного года.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
if (typeof Temporal === 'undefined') {
console.log('Этот браузер пока не поддерживает Temporal.')
} else {
const date = Temporal.PlainDate.from('2028-02-15')
console.log('День недели (1 — понедельник):', date.dayOfWeek)
console.log('Дней в месяце:', date.daysInMonth)
console.log('Високосный год:', date.inLeapYear)
const first = date.with({ day: 1 })
const last = date.with({ day: date.daysInMonth })
console.log('Первый и последний день месяца:', first.toString(), last.toString())
console.log('Строка для пользователя:', date.toLocaleString('ru-RU', { dateStyle: 'long' }))
}
Метод toLocaleString() форматирует дату для пользователя; для хранения и передачи используйте toString().
Связанные материалы
См. также обзор Temporal, Temporal.ZonedDateTime для дат с часовым поясом и документацию Temporal.PlainDate.