Temporal API в ECMAScript 2026: конец проблем Date
-
Temporal API наконец-то меняет подход к датам в JavaScript. Этот новый стандарт из ECMAScript 2026 решает старые боли объекта Date: мутации, неясный парсинг и проблемы с часовыми поясами. Теперь разработчики получат надежные инструменты для работы с временем без библиотек вроде date-fns.
С Temporal код становится предсказуемым и безопасным. Представьте: даты без случайных таймзон, неизменяемые значения и простая арифметика. Это спасет часы отладки в проектах с международными пользователями. Давайте разберем, как это работает на практике.
Почему Date устарел и как Temporal его заменяет
Объект Date в JavaScript мучил разработчиков десятилетиями. Парсинг строк вроде ‘2026-03-01’ зависит от локали браузера, что приводит к ошибкам. Арифметика мутирует объект, а таймзоны обрабатываются хаотично - иногда с UTC, иногда локально. Temporal вводит отдельные типы для разных задач: PlainDate для дат без времени, ZonedDateTime для дат с поясом.
Все типы неизменяемы - методы возвращают новые объекты, а не меняют старые. Это предотвращает баги от неожиданных мутаций. Парсинг стал строгим: Temporal.PlainDate.from(‘2026-02-13’) всегда создаст дату без времени и зоны. В Chrome 144 это уже стабильно работает, хотя Safari отстает.
Вот ключевые типы Temporal и их применение:
- PlainDate: дата без времени. Идеально для дней рождения или сроков. Пример:
Temporal.PlainDate.from('2026-02-13').add({ days: 7 })вернет 2026-02-20. - PlainTime: только время. Полезно для расписаний:
Temporal.PlainTime.from('14:30:00'). - ZonedDateTime: дата, время и пояс.
Temporal.Now.zonedDateTimeISO('Europe/Moscow')даст точное время в Москве. - Instant: абсолютный момент в UTC. Для логов и серверных меток.
- Duration: интервалы.
Temporal.Duration.from({ days: 5, hours: 3 })для вычислений.
Свойство Date Temporal Неизменяемость Мутации Новые объекты Парсинг Локаль-зависимый Строгий ISO Таймзоны Смешанные Явные типы Календари Только григорианский Множество Основные типы Temporal на примерах
Temporal предлагает namespace с классами вроде PlainDateTime, PlainYearMonth и PlainMonthDay. Каждый тип решает конкретную задачу: PlainYearMonth для подписок (‘2026-03’), PlainMonthDay для праздников (14 февраля). Арифметика простая и безопасная - add, subtract возвращают новые экземпляры.
Рассмотрим реальный сценарий: планировщик задач. С Date пришлось бы вручную корректировать зоны и парсить ISO. Temporal.Now.plainDateISO() даст сегодняшнюю дату, а .add({ weeks: 1 }) - будущую без сюрпризов. Форматирование через toLocaleString() использует ECMA-402 для локализации.
Практические примеры кода:
- Добавление дней:
const date = Temporal.PlainDate.from({ year: 2026, month: 3, day: 1 }); const next = date.add({ days: 30 }); console.log(next.toString()); // 2026-03-31 - Разница дат:
const diff = date.until(next); console.log(diff.days); // 30 - Зона:
const zoned = Temporal.ZonedDateTime.from('2026-03-01T10:00:00[Europe/Moscow]');
Важно: Temporal поддерживает не только ISO, но и другие календари - японский, буддистский. Это упрощает apps для Азии.
Арифметика и работа с Duration
Duration - сердце арифметики в Temporal. Этот класс представляет интервалы: дни, часы, минуты. Методы like({ hours: 2 }) нормализуют значения, учитывая високосные годы. Сравните с Date: new Date(date.getTime() + 86400000) может сдвинуть время из-за DST.
Temporal.Now.instant() дает точный момент для сервер-клиент синхронизации. Метод until() между датами возвращает Duration. Это идеально для дашбордов: вычисление overtime или сроков поставок без ошибок.
Преимущества Duration:
- Нормализация: 25 часов станет 1 день + 1 час.
- Арифметика: duration.add(otherDuration) без мутаций.
- Поддержка отрицательных значений для разниц в прошлом.
Таблица сравнения операций:
Операция Date пример Temporal пример +1 день date.setDate(date.getDate() + 1) date.add({ days: 1 }) Разница date2 - date1 date2.until(date1) Формат toISOString() toString() с опциями Temporal в production: что учесть
Несмотря на Stage 3, Chrome 144 уже использует Temporal стабильно. Полифиллы вроде @js-temporal/polyfill помогут в Safari и мобильных. Браузеры обновляются быстро, так что к 2026 полная поддержка реальна. Тестируйте на edge-кейсах: 29 февраля 2026 или переходы DST.
Остались нюансы: не все календари в полифиллах, и старый Date никуда не девается - используйте оба переходно. Подумайте о миграции в проектах с датами: начните с PlainDate для форм. Temporal меняет правила игры, но требует привыкания к новым типам. Дальше - глубокий дайв в ZonedDateTime для глобальных apps.
- PlainDate: дата без времени. Идеально для дней рождения или сроков. Пример:
© 2024 - 2026 ExLends, Inc. Все права защищены.