Первый финальный этап Temporal API: готовность к ECMAScript 2026 и браузерная поддержка
-
Temporal API наконец-то выходит на финишную прямую. Это современная замена старому объекту Date в JavaScript, которая решает проблемы с часовыми поясами, мутациями и неоднозначным парсингом. Разработчики давно ждут её, чтобы упростить работу с датами в проектах.
В этой статье разберём, что значит первый финальный этап Temporal, какова поддержка в браузерах на март 2026 года и как начать использовать API прямо сейчас. Это поможет оценить риски внедрения и подготовиться к ECMAScript 2026 без сюрпризов в продакшене.
Что такое Temporal API и почему он меняет правила игры
Temporal - это не просто новая библиотека, а полноценный набор immutable-объектов для работы с датами и временем. Старый Date часто подводит: он мутирует значения, игнорирует часовые пояса или даёт неожиданные сдвиги из-за локальных настроек. Temporal исправляет это, предлагая классы вроде ZonedDateTime для явной работы с зонами и PlainDateTime для локальных дат.
Представьте задачу: назначить встречу в Берлине на 31 января 2026 года. С Date результат зависит от таймзоны пользователя - может сдвинуться на день. Temporal же фиксирует зону явно, исключая баги. Это особенно критично для международных приложений, аналитики или расписаний. Теперь перейдём к ключевым типам и их отличиям.
Вот основные классы Temporal:
- Temporal.ZonedDateTime: дата-время с часовым поясом, идеально для событий вроде встреч.
- Temporal.PlainDateTime: локальная дата-время без зоны, для календарей.
- Temporal.Instant: момент в UTC, для логов или серверных вычислений.
- Temporal.Duration: интервалы времени, с immutable-арифметикой.
Класс Назначение Пример использования ZonedDateTime События в зоне new Temporal.ZonedDateTime(…, ‘Europe/Berlin’) PlainDateTime Локальные даты new Temporal.PlainDateTime(2026, 1, 31, 10, 0) Instant UTC-моменты Temporal.Now.instant() Duration Разности meeting.endDate.until(meeting.startDate) Важный нюанс: все объекты неизменяемы - операции возвращают новые экземпляры, без мутаций.
Готовность к ECMAScript 2026: стадия 4 и стандартизация
Temporal достиг стадии 4 в TC39 в первом квартале 2026 года, что делает его частью ECMAScript 2026. Это значит, спецификация финализирована - больше не будет breaking changes. Реализации в движках прошли все тесты, включая temporal_rs для V8. ECMAScript 2026 позиционирует Temporal как стандарт для дат, заменяя устаревший Date.
Браузеры активно догоняют: Chrome 144 и Edge 144 уже с полноценной поддержкой с января 2026. Firefox держит лидерство с версии 139 (май 2025). Safari отстаёт, но разработка в WebKit идёт полным ходом. Полифиллы вроде @js-temporal/polyfill готовы для продакшена, с размером всего ~20KB gzipped.
Ключевые этапы готовности:
- Стадия 3 -> 4: Q1 2026, финализация spec.
- Chrome/Edge: v144, январь 2026 - полная реализация.
- Firefox: v139+, стабильная с 2025.
- Полифиллы: @js-temporal/polyfill и @temporal/polyfill-proposal.
Браузер Версия с поддержкой Статус на март 2026 Chrome 144 Полная Firefox 139 Полная Edge 144 Полная Safari В разработке Частичная/отсутствует Совет: проверяйте поддержку через
typeof Temporal !== 'undefined'перед использованием.Браузерная поддержка: реальность на март 2026
К марту 2026 Temporal работает в 80%+ браузеров по CanIUse. Chrome и Edge на Chromium 144 обеспечивают полную совместимость, Firefox лидирует. Safari пока без native-поддержки, но полифиллы решают проблему. Мобильные браузеры (iOS Safari, Android Chrome) следуют десктопным версиям с лагом в 1-2 месяца.
Практика показывает: в проектах с аналитикой или scheduling Temporal снижает баги на 70%. Гибридный подход - Temporal внутри, Date на границах - минимизирует риски. Тестируйте на реальных устройствах: iPhone с iOS 19 может требовать полифилл.
Стратегии внедрения:
- Полный переход: для новых проектов на современных браузерах.
- Гибрид: Temporal для логики, Date для legacy API.
- Полифилл:
@js-temporal/polyfillдля полной кросс-браузерности.
const hasTemporal = typeof Temporal !== 'undefined'; const meeting = hasTemporal ? new Temporal.ZonedDateTime(/*...*/) : new Date(/* fallback */);Нюанс: полифиллы добавляют overhead, но необходимы для Safari.
Первые шаги: от эксперимента к продакшену
Начать просто: установите полифилл и замените Date в тестовой ветке. Temporal.Now.zonedDateTimeISO() даёт текущий момент с зоной. Арифметика через until() или add() исключает ошибки. Для международных apps используйте calendars вроде ‘islamic’ или ‘japanese’.
Пример миграции:
// Старый Date let dt = new Date('2026-01-31T10:00:00'); console.log(dt.toString()); // Зависит от локали // Temporal let tdt = new Temporal.ZonedDateTime( 1738278800000000000n, 'Europe/Berlin' ); console.log(tdt.toString()); // ФиксированоПреимущества на практике:
- Нет сдвигов из-за DST.
- Поддержка 100+ зон из IANA.
- Immutable - safer в async коде.
Проблема Date Решение Temporal Мутации Immutable объекты Неявные зоны Явные ZonedDateTime Парсинг строк Структурированный Temporal в экосистеме: библиотеки и фреймворки
К марту 2026 библиотеки обновляются: dayjs и date-fns добавляют Temporal-адаптеры. React/Vue hooks вроде useTemporalDate готовы. Node.js через V8 интегрирует native. ГраалVM и Ladybird тоже поддерживают.
Это упрощает миграцию: замените импорт, и код заработает. Но учтите: старые бандлы могут конфликтовать с полифиллами.
Обновлённые инструменты:
- Day.js: плагин temporal.
- Luxon: полная совместимость.
- Полифиллы: 2 варианта для выбора.
Горизонты ECMAScript 2026 за пределами Temporal
Temporal - звезда ES2026, но есть и другие фичи: Array.fromAsync(), RegExp.escape, Promise.try. Они шлифуют язык, делая его надёжнее. Safari догонит к середине года, унифицируя поддержку. Дальше - Records/Tuples и Pattern Matching на стадии 3.
Остаётся наблюдать за полифиллами и фреймворками: их адаптация ускорит adoption. Temporal закрывает 20-летнюю дыру в JS, но полная экосистема займёт 6-12 месяцев.
© 2024 - 2026 ExLends, Inc. Все права защищены.