Temporal API: как JavaScript решает проблемы с датами и временем
-
Temporal API - это новый стандарт в JavaScript для работы с датами и временем. Он решает хронические проблемы Date: мутабельность, путаницу с часовыми поясами и ненадежный парсинг строк. Теперь разработчики получают надежные классы для точных вычислений.
С Temporal код становится предсказуемым и безопасным. Нет больше неожиданных изменений дат или ошибок из-за DST. Это упрощает жизнь фронтенд-разработчикам, особенно в приложениях с расписаниями и событиями.
Почему Date устарел и как Temporal его заменяет
Классический объект Date в JavaScript мутирует значения при операциях, что приводит к багам. Например, добавление дня к 31 декабря меняет исходную дату, и завтрашний день может стать сегодняшним. Парсинг строк вроде “2025-04-09” работает нестабильно - иногда как UTC, иногда как локальное время.
Temporal вводит иммутабельные классы: все методы возвращают новые объекты, а не меняют старые. Это делает код проще для понимания и отладки. Плюс встроенная поддержка часовых поясов и календарей - никаких внешних библиотек вроде Moment.js.
- PlainDate: дата без времени и пояса, идеальна для дней рождения или сроков. Пример:
Temporal.PlainDate.from('2025-04-09')дает объект сyear,month,day. - PlainTime: только время, без даты. Полезно для расписаний:
Temporal.PlainTime.from('14:30:00'). - ZonedDateTime: дата-время с поясом, автоматически учитывает DST.
Temporal.Now.zonedDateTimeISO('Europe/Moscow').
Свойство Date Проблема Temporal решение Мутации setDate()меняет объектИммутабельность, новые объекты Часовые пояса Неявный локальный Явные ZonedDateTimeПарсинг Ненадежный Строгий ISO 8601 Основные классы Temporal для повседневных задач
Temporal.Now - это точка входа для текущего времени.
Temporal.Now.plainDateISO()вернет сегодняшнюю дату без лишнего, аTemporal.Now.instant()- момент в UTC с наносекундами. Это удобно для логов или API-запросов.Duration позволяет считать разницу между датами. Добавление интервалов не ломает логику - API сам обрабатывает переходы месяцев. Например, 31 января + 1 месяц становится 28 февраля в невисокосный год, без ошибок.
Вот примеры создания и операций:
const date = Temporal.PlainDate.from({year: 2025, month: 4, day: 9}); date.add({days: 1});- добавляет день, возвращает новый объект.const duration = date.until(Temporal.Now.plainDateISO());- разница в днях, месяцах.- Instant: точный момент глобально.
Temporal.Instant.fromEpochSeconds(1234567890)для timestamp.
Ключевой плюс: все классы поддерживают цепочки методов, как
date.with({month: 5}).add({years: 1}).Работа с часовыми поясами и календарями
Часовые пояса - вечный кошмар Date. В Temporal они задаются явно: ‘America/New_York’ или ‘Asia/Tokyo’.
ZonedDateTimeконвертирует времена автоматически, учитывая летнее время.Поддержка не-григорианских календарей открывает двери для локализации. PlainDate работает с буддистским или исламским календарем через опции. Это актуально для глобальных приложений.
Практические примеры:
- Текущее время в Москве:
Temporal.Now.zonedDateTimeISO('Europe/Moscow').toString()- ‘2026-03-02T12:00:00+03:00[Europe/Moscow]’. - Конверсия:
zoned.withTimeZone('UTC')- меняет пояс без сдвига момента. - Нюанс: неоднозначности DST разрешаются опциями ‘earliest’ или ‘latest’.
Класс Когда использовать Пример PlainDateTime Локальное дата-время События без пояса ZonedDateTime Глобальные встречи Zoom с разными зонами Duration Расчеты интервалов Сроки задач Temporal в production: что дает на практике
Temporal уже в Chrome 144 и Firefox Nightly, полная поддержка ожидается в 2026. Заменяет библиотеки, снижая бандл-сайз. Код чище: нет геттеров-сеттеров, все declarative.
Для фронтенда это прорыв в календарях, чатах, e-commerce. Вычисления предсказуемы, тесты проще. Осталось дождаться полифиллов для старых браузеров и инструментов вроде TypeScript.
Можно углубиться в редкие случаи: нестандартные календари или микросекундную точность. Или подумать, как Temporal интегрируется с Web APIs вроде Intl.
- PlainDate: дата без времени и пояса, идеальна для дней рождения или сроков. Пример:
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.