Temporal API в ECMAScript 2026: революция в работе с датами и временем
-
Temporal API в ECMAScript 2026 меняет подход к датам и времени в JavaScript. Старый объект Date полон проблем - он мутабельный, не учитывает часовые пояса правильно и парсит строки непредсказуемо. Теперь Temporal предлагает иммутабельные объекты с поддержкой зон и календарей, что упрощает код и снижает баги.
Это полезно для веб-приложений, где даты - частая головная боль. Temporal решает вопросы с летним временем, разными календарями и точными вычислениями. В статье разберем ключевые классы, примеры и сравнение с Date.
Что такое Temporal API и почему он лучше Date
Temporal - это пространство имен в JavaScript, похожее на Intl, с классами для разных аспектов дат и времени. Оно создано с нуля, чтобы избежать ошибок старого Date: мутации, нестабильный парсинг строк и игнор часовых поясов. Например, Date.toString() зависит от локали системы, а Temporal всегда предсказуем.
В ES2026 Temporal становится стандартом. Объекты иммутабельны - методы вроде add() или subtract() возвращают новые экземпляры, без побочных эффектов. Это идеально для многопоточного кода или состояний в React. Поддержка не-григорианских календарей и наносекунд делает его универсальным.
Вот основные классы Temporal:
- Temporal.Instant: точка на глобальной временной шкале, UTC.
- Temporal.ZonedDateTime: дата-время с часовым поясом.
- Temporal.PlainDateTime: дата-время без пояса.
- Temporal.PlainDate: только дата.
- Temporal.Now: методы для текущего времени.
Класс Что представляет Пример использования Instant Момент в UTC Фиксация события глобально ZonedDateTime Дата-время в поясе Встречи с учетом DST PlainDateTime Локальная дата-время Формы без пояса PlainDate Только дата День рождения Основные классы и их методы
Temporal.Now.zonal() возвращает ZonedDateTime в указанном поясе, а plainDateTime() - без него. Методы like until(), since() вычисляют разницу точно, с учетом DST. Классы сравнимы: Instant.compare() или equals() упрощают сортировку.
Рассмотрим пример: создание даты 2026-03-04 12:00 в Москве. С Date пришлось бы вручную корректировать offset, рискуя ошибкой. Temporal.ZonedDateTime.from(‘2026-03-04T12:00:00[Europe/Moscow]’) делает это автоматически. Методы round() округляют до нужной точности.
Ключевые методы для работы:
- add(duration): добавляет интервал, возвращает новый объект.
- subtract(duration): вычитает, иммутабельно.
- toString(): ISO 8601 с наносекундами и поясом.
- toLocaleString(): локализация с календарем.
- valueOf(): для сравнений.
Важный нюанс: диапазон дат от -271821-04-20 до +275760-09-13, как у Date, но с точными лимитами.
Примеры кода: от простого к сложному
Начнем с базового: const today = Temporal.Now.plainDate(); выдает текущую дату без времени. Для интервалов: const diff = start.until(end); возвращает Duration с годами, месяцами, секундами. Это лучше Date.getTime() разницы в миллисекундах.
В реальном проекте для напоминаний о встречах: ZonedDateTime сравнивает с Now.instant(), учитывая пояс. Нет магии - все явно. Для баз данных: PlainDate сохраняет дату без времени, избегая смещений.
Простые примеры:
- Текущая дата:
Temporal.Now.plainDate('iso8601').toString()- ‘2026-03-04’. - Разница:
dt1.until(dt2)- объект с полями years, months и т.д. - Округление:
dt.round({ largestUnit: 'hour' })- до часа.
Сравнение производительности:
Операция Date Temporal Парсинг Рискованный Точный ISO Добавление Мутация Новый объект Пояса Ручной offset Встроенный Разница Миллисекунды Структурированная Temporal в проектах: переход и практики
Миграция проста: замените new Date() на Temporal.PlainDateTime.from(). Браузеры вроде Chrome 144 уже поддерживают. Для Node.js - флаг или полифилл. Нюанс: старый код с Date.parse() сломается - парсер строгий.
В фронтенде Temporal упрощает календари, чаты с таймстампами. На бэкенде - логи, scheduling. Комбинируйте с using для ресурсов вроде файлов с датами.
Практики:
- Выбирайте класс по задаче: Instant для серверов, ZonedDateTime для UI.
- Всегда указывайте пояс в ZonedDateTime.
- Тестируйте на границах: DST, високосные годы.
Преимущества: меньше багов на 90%, код чище.
За пределами базовых дат
Temporal открывает двери для продвинутых сценариев вроде финансовых расчетов или игр с временем. Осталось место для интеграций с Web APIs и кастомных календарей. Стоит поэкспериментировать с Pattern Matching из ES2026 для обработки дат.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.