JavaScript объект Temporal.PlainDate

Определение и применение

Temporal.PlainDate представляет календарную дату без времени и часового пояса. Он подходит для дат рождения, праздников, дат заезда и сроков «до 31 декабря»: такая дата одинакова в любом часовом поясе.

Поддержка браузерами

Спецификация: proposal-temporal

Нет поддержки: Safari iOS, Samsung Android, WebView iOS.

Отдельные значения (34) поддерживаются не везде — смотрите таблицу.

Показать браузеры
Совместимостьjavascript.builtins.Temporal.PlainDate
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
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 islamic, islamic-rgsa and islamic-umalqura are not available. See bug 1950425 and bug 1954138.

✓128✓preview✓144◐139

Версия 139 выпущена в 2025 г. — Частичная поддержка

Примечание MDN (англ.)

Calendars islamic, islamic-rgsa and islamic-umalqura are not available. See bug 1950425 and bug 1954138.

✓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 синтаксис

JavaScript
Temporal.PlainDate.from(item, options);
new Temporal.PlainDate(year, month, day, calendar);

Для строки '2026-10-27' или объекта полей удобнее from(). Конструктор принимает числа и всегда отклоняет несуществующую дату.

Значения параметров

Параметры создания Temporal.PlainDate
ПараметрОписание
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
СвойствоОписание
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() или арифметику.

Свойства экземпляра Temporal.PlainDate
СвойствоОписание
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.
inLeapYeartrue, если год високосный.

Методы Temporal.PlainDate

Статические методы

Статические методы Temporal.PlainDate
МетодОписание
Temporal.PlainDate.from(item, options)Создаёт дату из строки ISO 8601, объекта полей или другого значения Temporal с датой.
Temporal.PlainDate.compare(one, two)Сравнивает даты: -1, 0 или 1. Подходит для Array.prototype.sort().

Методы экземпляра

Методы не изменяют исходный объект: вычисления возвращают новое значение.

Методы экземпляра Temporal.PlainDate
МетодОписание
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
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
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
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
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.