Temporal API достигает Stage 4: революция в датах и времени JS 2026
-
Temporal API официально вышел на Stage 4 в TC39. Это значит, что браузеры скоро получат встроенную замену старому Date.
Работа с датами в JavaScript всегда была головной болью. Неправильный парсинг, отсутствие нормальной поддержки часовых поясов и мутабельность объектов приводили к багам. Temporal решает эти проблемы раз и навсегда, предлагая надежные инструменты для приложений с расписаниями, календарями и временем.
Теперь разработчики смогут писать код без polyfill’ов и с предсказуемым поведением везде.
Что такое Temporal и почему он меняет правила игры
Temporal - это новый глобальный объект в JavaScript, который заменяет Date. Он вводит immutable объекты, полную поддержку часовых поясов и календарей. Вместо путаницы с месяцами с 0-индексацией и ненадежным парсингом здесь все предсказуемо.
Представьте задачу: посчитать разницу во времени между встречей в Нью-Йорке и Париже. С Date это фестиваль ошибок из-за переходов на летнее время. Temporal использует ZonedDateTime для точных вычислений, учитывая offset и локальные правила. Уже есть примеры в Firefox Nightly и polyfill’ах, показывающие стабильность.
Экспериментальные реализации в браузерах подтверждают: API готов к продакшену. Это упростит код в веб-приложениях, где время критично, от дашбордов до мобильных напоминаний.
- Instant: точка во времени, независимая от зон (например, epoch timestamp).
- ZonedDateTime: дата-время с зоной, автоматически корректирует DST.
- Duration: неизменяемая длительность, сравнивается лексикографически.
Концепция Описание Пример Instant Универсальная точка Temporal.Instant.fromEpochMilliseconds(1851222399924)Duration Интервал Temporal.Duration.from({hours:1, minutes:30})ZonedDateTime С зоной Temporal.ZonedDateTime.from('2021-08-01T12:00[America/New_York]')Основные проблемы Date и как Temporal их фиксит
Старый Date поддерживает только локальное время и UTC, без нормальных зон. Парсинг строк - лотерея: ‘2024-03-09’ может интерпретироваться по-разному. Объекты мутабельны, что ломает чистый код и тесты.
Temporal делает все immutable: вызовы вроде add() возвращают новый объект. Поддержка IANA зон (Europe/Paris, US/Eastern) встроена. Сравнение Duration работает как ожидается - PT1H30M раньше PT2H.
В реальных проектах это спасает от багов в scheduling. Например, добавление 24 часов к дате в DST-зоне не сдвинет время, как в Date.
const zdt = Temporal.ZonedDateTime.from('2024-03-09T17:00-05[-05]'); const nextDay = zdt.add('P1d'); console.log(nextDay.toString()); // 2024-03-10T17:00:00-05:00[-05:00]- Парсинг с offset:
Temporal.ZonedDateTime.from('2025-06-20T17:00+08[US/Eastern]')игнорирует неверный offset. - Локализация:
duration.toLocaleString('en-US')дает читаемый формат. - Сортировка:
Temporal.Duration.compareупорядочивает интервалы правильно.
Проблема Date Решение Temporal Выгода Нет зон ZonedDateTime Точные переходы DST Мутабельность Immutable Без побочек Плохой парсинг Структурированный Предсказуемость Нет Duration Отдельный тип Легкие расчеты Примеры кода: от простого к сложному
Начнем с базового: создание Instant и Duration.
Temporal.Now.instant()дает текущий момент, а until() вычисляет разницу.const launch = Temporal.Instant.fromEpochMilliseconds(1851222399924); const now = Temporal.Now.instant(); const duration = now.until(launch, {smallestUnit: 'hour'}); console.log(`Осталось ${duration.toLocaleString('ru-RU')} до запуска`);Для зон: конвертируем встречу из Нью-Йорка в Париж. withTimeZone() сохраняет момент, меняя представление.
const meeting = Temporal.ZonedDateTime.from('2021-08-01T12:00[America/New_York]'); const parisTime = meeting.withTimeZone('Europe/Paris'); console.log(parisTime.toString()); // 2021-08-01T18:00:00+02:00[Europe/Paris]Это работает в polyfill’ах вроде @js-temporal/polyfill, готовясь к нативной поддержке.
- Добавление интервала:
zoned.add(duration)- новый объект без мутаций. - Нюанс: Leap seconds игнорируются для простоты.
- Сравнение зон:
zdt.withTimeZone('UTC')для унификации.
Готовность к продакшену и миграция
На Stage 4 спецификация завершена, изменения минимальны. Браузеры вроде Firefox уже тестируют, Chrome и Safari последуют. Polyfill позволяет использовать сейчас.
Миграция простая: замените new Date() на Temporal.PlainDate или ZonedDateTime. Тесты покажут разницу в точности. Для старых проектов -енная замена в модулях с временем.
const durations = [ Temporal.Duration.from({hours:1}), Temporal.Duration.from({hours:1, minutes:30}) ]; durations.sort(Temporal.Duration.compare);- Polyfill:
npm i @js-temporal/polyfill- 100% покрытие. - Браузерная поддержка: экспериментально в Nightly.
- Важно: Используйте {offset: ‘ignore’} для lenient парсинга.
Статус Поддержка Рекомендация Polyfill Полная Для продакшена сейчас Firefox Эксперимент Тестировать Chrome/Safari Скоро Ждать 2026 Temporal открывает новые горизонты
Stage 4 - это зеленый свет для экосистемы. Останутся нюансы вроде кастомных календарей или интеграции с Intl API.
Дальше - оптимизации под WebAssembly и мобильные устройства. Стоит поэкспериментировать с polyfill’ом, чтобы код стал чище и надежнее уже сегодня.
Temporal меняет не только JS, но и подход к времени в веб-разработке в целом.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.