Temporal API достигает стадии 4: конец проблем с датами в JavaScript
-
Temporal API наконец достигает стадии 4 в процессе TC39. Это значит, что JavaScript получит надежный инструмент для работы с датами и временем. Старый объект Date уходит в прошлое с его путаницей в часовых поясах и мутациями.
Теперь разработчики смогут писать код без багов из-за перехода на летнее время или разных календарей. Temporal предлагает иммутабельные типы и точные вычисления. Это упростит задачи в веб-приложениях, аналитике и планировщиках.
Что такое Temporal API и почему он нужен
Temporal - это набор классов для дат и времени в JavaScript. Он решает проблемы Date: отсутствие поддержки часовых поясов, мутации объектов и неудобный API. Представьте, вы парсите строку ‘2025-04-03’, Date может сломаться из-за локали, а Temporal всегда вернет предсказуемый PlainDate.
Работа с временными зонами в Date часто приводит к ошибкам, особенно в глобальных приложениях. Temporal вводит ZonedDateTime, который учитывает DST и offset. Это критично для систем бронирования или финансов. Спецификация на 86% готова к stage 4, браузеры уже тестируют.
- Temporal.Instant: точка во времени в UTC, идеальна для логов и таймстампов.
- Temporal.ZonedDateTime: дата-время с часовым поясом, автоматически обрабатывает переходы.
- Temporal.PlainDate: просто дата без времени, без зависимости от зоны.
- Temporal.Duration: вычисления разностей, например, now.until(launch).
Свойство Date Temporal Иммутабельность Нет, мутирует Да, всегда immutable Часовые пояса Частично, IANA неполная Полная поддержка всех зон Парсинг Локаль-зависимый Стандартизированный ISO Вычисления Риск ошибок Точные методы like add/difference Ключевые типы в Temporal
Temporal предлагает несколько классов для разных сценариев. PlainDateTime сочетает дату и время без зоны - удобно для локальных событий. ZonedDateTime добавляет пояс, как ‘Europe/Moscow’. Instant - глобальное мгновение, не меняется при конверсии.
Пример: const now = Temporal.Now.zonedDateTime(‘UTC’); now.toString() даст точный ISO-строку. Сравнения просты: date1.equals(date2) без сюрпризов. Форматирование через toLocaleString() с опциями. Это решает 80% кейсов без библиотек вроде Luxon.
- PlainDate.from(‘2025-04-03’): создает дату, игнорируя время.
- Temporal.Now.instant(): текущее UTC-время.
- duration = now.until(event): разница в часах или днях.
- until({smallestUnit: ‘hour’}): кастомные единицы.
const launch = Temporal.Instant.fromEpochMilliseconds(1851222399924); const now = Temporal.Now.instant(); const duration = now.until(launch, { smallestUnit: "hour" }); console.log(duration.toLocaleString("en-US")); // Вывод: 31,600 hr until the launchСравнение с библиотеками и Date
Библиотеки вроде date-fns или Day.js патчили дыры Date, но требовали бандла. Temporal встроен в движок, быстрее и легче. Moment.js устарел, Luxon хорош, но теперь может стать оберткой. Chrome 144 уже шлет Temporal, Firefox тестирует.
Миграция постепенная: используйте polyfill для старых браузеров. Safari отстает, но stage 4 ускорит. В мобильной разработке это спасет от багов с часовыми поясами. Таблица показывает, почему переход выгоден.
Библиотека Размер Поддержка зон Иммутабельность Встроенность Date 0 Слабая Нет Да Moment.js 70kb Хорошая Нет Нет date-fns 20kb Базовая Да Нет Temporal 0 Полная Да Да Переход на Temporal в проектах
Начните с простых замен: вместо new Date() используйте Temporal.Now. Для парсинга - from(‘2025-04-03T12:00:00’). Проекты с TypeScript оценят типы: PlainDate имеет четкие методы. Тестирование проще - нет рандомных мутаций.
Интеграция с фреймворками: React/Vue смогут использовать хуки с Temporal. Deno поддерживает за флагом. Осталось доработать 14% до stage 4 - это открытые issues в GitHub. Браузеры синхронизируют имплементации.
Горизонты Temporal
Stage 4 закроет главные пробелы, но кастомные календари отложены в v2. Подумайте о полифиллах для Safari. Библиотеки эволюционируют в утилиты над Temporal.
Это меняет правила для JS-разработки. Время сосредоточиться на логике, а не на патчах дат.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.