Temporal API в ECMAScript 2026: замена Date с реализациями на Rust
-
Temporal API наконец-то выходит на сцену в ECMAScript 2026, предлагая полную замену проблемному объекту Date. Этот новый стандарт решает ключевые боли разработчиков: мутабельность, неясный парсинг и хаос с часовыми поясами. С Temporal код становится предсказуемым и безопасным для международных приложений.
Зачем это нужно? Старый Date годами мутировал данные неожиданно, что приводило к багам в production. Temporal вводит иммутабельные типы и точную работу с календарями. А реализации на Rust добавляют скорость и надежность для серверов и WASM.
Почему Date пора на пенсию
Date в JavaScript - это relic из 90-х, полный компромиссов. Он мутирует при операциях, парсит строки неоднозначно и путается в переходах на летнее время. Представьте: один setDate меняет дату для всех ссылок, если забыли клонировать объект. Это классическая ловушка для новичков и ветеранов.
Temporal меняет подход кардинально. Вместо единого класса - набор специализированных: PlainDate для дат без времени, ZonedDateTime для зон с учетом DST. Все операции возвращают новые объекты, без мутаций. Chrome 144 уже поддерживает это стабильно, Firefox следует за ним.
Вот типичные проблемы Date и как Temporal их фиксит:
- Мутация: Date.setDate() меняет оригинал. В Temporal.add() всегда новый экземпляр.
- Парсинг: new Date(‘2026-03-09’) зависит от локали. Temporal.PlainDate.from() требует ISO-формата строго.
- Часовые пояса: Date игнорирует нюансы. Temporal.Now.zonedDateTimeISO(‘Europe/Moscow’) дает точный момент с учетом правил.
Проблема Date Решение в Temporal Мутация объектов Иммутабельные типы Неоднозначный парсинг Строгий ISO 8601 Слабая поддержка зон Встроенные IANA зоны Нет календарей Поддержка Gregorian, Japanese и др. Ключевые классы Temporal API
Temporal - это namespace с классами под разные задачи. PlainDate хранит год-месяц-день без времени, идеально для дней рождения или событий. PlainTime фокусируется на часах-минутах. ZonedDateTime комбинирует дату, время и зону - для расписаний и уведомлений.
Пример: добавляем неделю к дате без мутаций.
const start = Temporal.PlainDate.from('2026-02-13'); const end = start.add({ days: 7 }); console.log(end.toString()); // 2026-02-20Здесь end - новый объект, start не меняется. Для времени с зоной:
const now = Temporal.Now.zonedDateTimeISO('Europe/London'); const later = now.add({ hours: 2 });Список основных классов с примерами:
- PlainDate:
Temporal.PlainDate.from('2026-03-09')- дата без времени. - ZonedDateTime:
Temporal.ZonedDateTime.from('2026-03-09T15:00:00[Europe/Moscow]')- с зоной. - Duration:
Temporal.Duration.from({ days: 5, hours: 3 })- интервалы для вычислений. - Instant: Точное мгновение в UTC, без календаря.
Методы общие: add(), subtract(), until(), round(). Все иммутабельны.
Temporal на Rust: скорость для реального мира
Браузеры внедряют Temporal в JS, но для серверов и WASM нужна нативная скорость. Rust реализации - это бонус: библиотеки вроде rust-temporal переводят API 1:1 в безопасный код. Они быстрее Node.js Date на порядки за счет zero-cost abstractions.
Представьте бэкенд на Rust с WebAssembly: Temporal.ZonedDateTime работает в браузере, Rust-версия - на сервере. Синхронизация идеальна, без переводов форматов. Проекты вроде temporal-rust уже предлагают crates для интеграции.
Преимущества Rust-имплементаций:
- Производительность: Парсинг на 10x быстрее JS в benchmarks.
- Безопасность: Нет GC-пауз, память под контролем.
- Кросс-платформа: WASM для фронта, CLI для скриптов.
- Полная совместимость: Тот же API, что в ECMAScript 2026.
JS Temporal Rust Temporal Браузер/Node Сервер/WASM/CLI GC-зависим No-GC скорость Stage 3 impl Стабильные crates Пример на Rust (синтаксис упрощен):
use temporal::PlainDate; let start = PlainDate::from_ymd(2026, 3, 9); let end = start.add_days(7);Что ждет Temporal в 2026
ECMAScript 2026 официально включит Temporal на Stage 4, закрывая стандартизацию. Safari отстает, но давление растет - мобильные apps требуют точных дат. Rust-библиотеки заполнят пробелы, особенно для enterprise.
Останутся нюансы: диапазон дат ±10^8 дней от эпохи, поддержка редких календарей в доработке. Стоит присмотреться к polyfill’ам вроде @js-temporal/polyfill для legacy-браузеров. В итоге Temporal меняет игру для JS-разработки повсеместно.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.