Temporal API в ECMAScript 2026: конец проблем с датами в JavaScript
-
Temporal API в ECMAScript 2026 меняет подход к датам и времени в JavaScript. Старый объект Date полон ловушек - мутации, проблемы с часовыми поясами и неудобный API. Теперь с Temporal эти боли уходят: immutable объекты, полная поддержка зон и календарей.
Это полезно для всех, кто работает с расписаниями, логами или международными проектами. Temporal дает точность и предсказуемость, без багов от DST или неправильных парсингов. Давайте разберем, как это работает на практике.
Что не так с Date и как Temporal все исправляет
Объект Date в JavaScript - это реликвия 90-х. Он мутирует при любом изменении, путает локальные зоны с UTC и не умеет работать с датами без времени. Например, new Date() зависит от системных настроек, а getDate() может дать неожиданный результат из-за перехода на летнее время.
Temporal вводит namespace с классами вроде PlainDate, ZonedDateTime и Instant. Эти объекты неизменяемы: вызов метода возвращает новый экземпляр, не трогая оригинал. Поддержка всех зон через IANA и календарей вроде японского или исламского - из коробки. Нет больше гаданий о формате строки - парсинг по RFC 9557 с наносекундами.
Вот ключевые отличия:
- PlainDate хранит только дату (год-месяц-день), без времени.
- PlainTime - только время, без даты.
- ZonedDateTime учитывает зону и DST автоматически.
Свойство Date Temporal Неизменяемость Нет, мутирует Да, immutable Часовые пояса Частично, с UTC Полная поддержка IANA Календари Только григорианский Любые, включая буддистский Точность Миллисекунды Наносекунды Основные классы Temporal на примерах
Temporal.Now - точка входа для текущего времени. Temporal.Now.plainDateISO() вернет PlainDate на сегодня в ISO-формате. Никаких new Date() с сюрпризами. Для zoned времени: Temporal.Now.zonedDateTimeISO(‘Europe/Moscow’).
Представьте задачу: добавить 3 дня к дате. С Date это setDate(getDate() + 3), что сломает месяц. В Temporal: date.add({ days: 3 }) - просто и безопасно. Subtract работает аналогично для вычитания. Методы since() и until() считают разницу как Duration.
- Instant: момент в UTC, идеален для логов. Instant.from(‘2026-03-05T07:00:00Z’).
- PlainDateTime: дата + время без зоны, для локальных событий.
- ZonedDateTime: полная дата-время-зона, с round() для округления.
const today = Temporal.Now.plainDateISO(); const future = today.add({ days: 7 }); console.log(future.toString()); // 2026-03-12Работа с duration и сравнениями
Duration - класс для интервалов: { years: 1, months: 2, days: 3 }. AddDurationToDate() добавляет его к дате с учетом календаря. Никаких переполнений месяцев - Temporal нормализует.
Сравнения просты: date1.equals(date2) или compare(). Для сортировки массивов дат - Instant.compare(). toJSON() и toString() дают стандартные форматы, совместимые с JSON.
Преимущества в таблице:
Операция Пример кода Добавить неделю date.add({ weeks: 1 }) Разница date1.until(date2) Округлить dt.round({ nearestTo: ‘hour’ }) - until() возвращает Duration между датами.
Важно: options для overflow - ‘constrain’ или ‘reject’. - round() полезен для финансовых вычислений.
Temporal в реальных проектах
В фронтенде Temporal упрощает календари и формы. Бекенд получает точные timestamps без библиотеки Luxon или Day.js. Мобильные apps с intl работают с локализацией через toLocaleString().
Пример расписания:
const event = Temporal.ZonedDateTime.from('2026-03-05T10:00:00[Europe/Moscow]'); const end = event.add({ hours: 2 });Короткие типы вроде PlainYearMonth для подписок или PlainMonthDay для дней рождения. Диапазон дат - от -271821 года до +275760, хватит на века.
Новые горизонты с Temporal
Temporal закрывает 90% кейсов без внешних либ. Осталось доработать интеграцию с Web APIs и производительность в старых движках. Стоит поэкспериментировать с календарями вроде ‘islamic’ для глобальных проектов.
В ECMAScript 2026 это стандарт - Chrome, Firefox и Safari уже поддерживают. Переход постепенный, но код станет чище и надежнее сразу.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.