Temporal API достигает stage 4: как новая дата и время заменят Date в JavaScript
-
Temporal API наконец-то достиг stage 4 в TC39. Это значит, что современная работа с датами и временем в JavaScript выходит из стадии экспериментов. Новая библиотека решает ключевые проблемы старого Date: мутации, путаницу с часовыми поясами и неудобный API.
Зачем это нужно разработчикам? Старый Date часто приводит к багам в проектах с разными часовыми поясами или календарями. Temporal предлагает неизменяемые объекты, точную обработку интервалов и нативную поддержку IANA timezone. Теперь можно забыть про библиотеки вроде date-fns или dayjs - браузеры сами справятся.
Проблемы Date и почему пора менять
Старый Date в JavaScript работает как timestamp с методами для компонентов даты. Но он мутирует состояние, путает локальное время с UTC и не поддерживает durations или intervals напрямую. Например, new Date(‘2025-04-03’) парсится как локальное время, а не ISO-дата, что ломает логику в разных зонах.
Temporal меняет подход: вводит namespace с классами вроде PlainDate, ZonedDateTime и Instant. Все объекты неизменяемые - вызовы методов возвращают новые экземпляры. Это устраняет side effects. К тому же, поддержка стандартов ISO-8601, RFC9557 и IANA делает парсинг предсказуемым.
Вот типичные проблемы Date:
- Мутация: date.setFullYear() меняет объект на месте.
- Часовые пояса: Нет нативной поддержки, приходится хакать с UTC.
- Парсинг: new Date() не всегда следует ISO строго.
- Отсутствие durations: Нет встроенного способа считать P1D или PT1H.
Сравнение Date Temporal Неизменяемость Нет Да Timezone Частично Полная (IANA) Durations Нет Native Парсинг строк Нестабильный RFC9557/ISO Ключевые классы Temporal
Temporal - это набор классов для разных сценариев. PlainDate хранит только дату без времени, ZonedDateTime - дату, время и пояс. Instant фиксирует момент в UTC. Каждый класс следует RFC9557: YYYY-MM-DDTHH:mm:ss.sssssssssZ[zone].
Пример: Temporal.PlainDate.from(‘2025-04-03’) дает чистую дату без зоны. Для полной картины используй ZonedDateTime.from(‘2025-04-03T00:00Z[UTC]’). Это удобно для серверов, где время всегда в UTC, но клиенты видят локальное.
Основные классы:
- Temporal.PlainDate: Дата (год-месяц-день), календарные операции.
- Temporal.ZonedDateTime: Дата-время с поясом, учитывает DST.
- Temporal.Instant: Абсолютный момент, как Unix timestamp в наносекундах.
- Temporal.Duration: Интервалы вроде ‘P1Y2M’ или ‘PT3H30M’, арифметика.
Нюанс: Диапазон - от -271821-04-20 до +275760-09-13, как у Date.
Пример кода:
let date = Temporal.PlainDate.from('2025-04-03'); let zoned = Temporal.ZonedDateTime.from('2025-04-03T12:00[Europe/Moscow]'); let nextDay = date.add({ days: 1 }); // Новый объект! console.log(nextDay.toString()); // 2025-04-04Работа с durations и зонами
Durations в Temporal - это объекты для сложной арифметики. add(‘P1D’) к ZonedDateTime учитывает переходы DST - добавит календарный день, а не 24 часа. Это критично для расписаний: концерт в 18:00[Europe/Dublin] останется в 18:00 даже после смены времени.
Методы вроде .add() и .subtract() принимают DurationLike или опции. Temporal.Now.instant() дает текущий момент с наносекундами. Конвертация зон: zoned.withTimeZone(‘America/New_York’) создает новый объект без мутаций.
Примеры операций:
- Добавь день: zdt.add(‘P1D’).toString() -> Учитывает зону.
- Duration из двух дат: date1.until(date2) -> ‘P2W3D’.
- Текущее время: Temporal.Now.zonedDateTimeISO(‘UTC’).
Операция Date эквивалент Temporal +1 день setDate + get .add({days:1}) Разница getTime() diff .until() Зона Manual .withTimeZone() Готовность к продакшену
Temporal на stage 4 - spec стабилен, браузеры внедряют. Firefox уже поддерживает, Deno за флагом, Chrome в пути. Требование: две совместимые имплементации с тестами. Пока используй polyfill для старых сред.
Интеграция с Intl для локализации: Intl.DateTimeFormat работает с Temporal. Нет нужды тащить библиотеки - браузеры везут IANA данные.
Что проверить:
- Поддержка в target браузерах.
- Polyfill для legacy.
- Тесты на DST и leap seconds (Temporal их игнорирует).
Temporal меняет правила игры
Temporal закрывает пробелы Date, делая JS конкурентным в enterprise. Осталось дождаться полной поддержки в Chrome - тогда мигрировать станет проще. Подумайте о рефакторинге: начните с PlainDate для дат без времени, перейдите на ZonedDateTime для глобальных apps.
Дальше - полировка edge-кейсов вроде редких календарей или наносекунд в базах. Это не конец, но солидный шаг к надежному datetime в вебе.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.