Temporal API достиг стадии 4: конец эпохи Date в JavaScript
-
Temporal API наконец-то вышел на стадию 4 в TC39. Это значит, что он официально войдет в стандарт ECMAScript, и объект Date уйдет в прошлое. Разработчики получат надежный инструмент для работы с датами, временем и часовыми поясами без багов и путаницы.
Сейчас многие проекты мучаются с Date из-за его неявного поведения и ошибок в парсинге. Temporal решает эти проблемы строгим API и отдельными типами данных. Это упростит код, сделает его предсказуемым и избавит от лишних библиотек вроде Moment.js.
Почему Date - это вечная головная боль
Объект Date в JavaScript создавался в 90-х и копировал Java, но без учета реальной сложности дат. Он хранит время как миллисекунды от Unix-эпохи, но парсит строки странно: ‘03/04/2023’ может быть мартом или апрелем в зависимости от локали. Мутации через set методы ломают иммутабельность, а часовые пояса обрабатываются криво.
Представьте: вы пишете логику для международного приложения, и вдруг дата сдвигается из-за DST. Date не различает календарную дату и момент во времени, что приводит к ошибкам в 30% случаев по тестам. Temporal разделяет эти понятия на классы, делая код явным и безопасным. Это не просто апгрейд - это переосмысление проблемы.
- Парсинг строк: Date(‘2023-03-04’) предполагает UTC, но локальные строки парсятся по браузеру. Temporal.Now.zonedDateTimeISO() всегда четко.
- Мутации: date.setFullYear() меняет объект на месте. В Temporal объекты неизменяемы - withFullYear() возвращает новый.
- Часовые поясы: Date.toString() игнорирует IANA-зоны. Temporal.ZonedDateTime использует их нативно.
Проблема Date Temporal Парсинг Неоднозначный, локаль-зависимый Строгий, с валидацией Иммутабельность Мутации на месте Всегда новые объекты Пояса Ограниченная поддержка Полная IANA, offsets Точность Миллисекунды Наносекунды Основные классы Temporal: что внутри
Temporal - это не один объект, а набор классов для разных задач. Temporal.Instant - точка на шкале Unix-времени, Temporal.PlainDate - календарная дата без времени. ZonedDateTime добавляет пояс, а Duration - интервалы. Каждый класс имеет методы вроде until() для разниц или add() для арифметики.
Например, создание текущего момента: Temporal.Now.instant() дает точное время с наносекундами. Сравните с new Date(), где точность ниже. Форматирование через toLocaleString() учитывает локаль правильно, без хаков. Это делает API интуитивным для повседневных задач вроде фильтров по датам в UI.
- Temporal.Instant: Для моментов во времени.
Temporal.Instant.from('2023-03-04T12:00Z')- просто и точно. - Temporal.PlainDate: Чистая дата.
Temporal.PlainDate.from({'year': 2023, 'month': 3, 'day': 4})- порядок не важен. - Temporal.Duration: Интервалы.
new Temporal.Duration(1, 2, 3)- годы, месяцы, дни. - Temporal.ZonedDateTime: С поясом.
Temporal.Now.zonedDateTime('Europe/Moscow').
Сравнение Date и Temporal на примерах
Возьмем задачу: вычислить разницу между датами с учетом пояса. В Date: new Date(‘2023-03-04T12:00+03:00’) минус new Date(‘2023-03-03T12:00+00:00’) даст миллисекунды, но с хаком для дней. Temporal: zoned1.until(zoned2, {largestUnit: ‘days’}) вернет {days: 1} чисто.
Другая боль - арифметика. Date.addHours() нет, приходится вручную. Temporal.PlainDate.from() .add({hours: 2}) создает новый объект без мутаций. В проектах с расписаниями или отчетами это сэкономит часы дебага. Полифиллы уже готовы для продакшена, так что тестировать можно сейчас.
// Date let d = new Date('2023-03-04'); d.setDate(5); // Мутация! // Temporal const date = Temporal.PlainDate.from('2023-03-04'); const newDate = date.add({days: 1}); // Новый объект date.equals(newDate); // falseЗадача Date код Temporal код Текущая дата new Date() Temporal.Now.plainDateISO() Разница getTime() diff until({unit: ‘hours’}) Пояс getTimezoneOffset() zonedDateTime(‘UTC’) Формат toISOString() toLocaleString(‘ru’) Стадия 4: что меняется в движках
Temporal на стадии 4 - это сигнал для браузеров: Firefox уже имеет, V8 в Chromium 144 интегрирует. Safari и полифиллы @js-temporal/polyfill покрывают остальное. Спецификация прошла тысячи тестов, упростилась для стабильности. Размер API большой, но встроенный - лучше 100 КБ Moment.js.
Миграция постепенная: старый код работает, новый использует Temporal. TC39 ожидает ECMAScript 2026 с ним. Это конец эры, когда даты - источник багов 20% проектов.
Взгляд в код: переход на Temporal
Начните с простого: замените new Date() на Temporal.Now.instant(). Для дат - PlainDate, для событий - ZonedDateTime. Проверяйте типы: instanceof Temporal.PlainDate. Инструменты вроде ESLint уже имеют правила для миграции. В больших командах это ускорит ревью.
Пример конвертации строки: Temporal.PlainDate.from(‘2023-03-04’) валидирует, Date - нет. Until() и since() дают разности в нужных единицах. Сравнения < > работают между типами с coerce. Это делает Temporal гибким для legacy-кода.
- Миграция шаг 1: Заменить парсинг на from() методы.
- Шаг 2: Использовать with() вместо set*().
- Шаг 3: Добавить пояса через zonedDateTime().
Готовность к продакшену и нюансы
Полифиллы стабильны, V8-библиотека 0.1 проходит тесты. Точность до наносекунд полезна для финансов и логов. Минус - размер бандла +5-10% из-за нативки, но без внешних deps. Календари вроде японского или исламского поддерживаются.
Важно: Temporal не ретрофит Date - новый namespace. Hybrid-подход: if (Temporal) use it. Тесты показывают 90% меньше ошибок в датах.
Браузер Статус Полифилл Firefox Полная Не нужен Chrome 144+ Полная @js-temporal Safari В разработке polyfill Temporal меняет правила игры
Стадия 4 закрывает 10-летний цикл разработки. Date останется для простоты, но Temporal - стандарт для серьезных задач. Останутся вопросы по производительности в edge-кейсах и интеграции с Web APIs. Стоит изучить документацию и потестировать в проектах - будущее уже здесь.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.