Temporal API: как новый стандарт изменит работу с датами в JavaScript
-
Temporal API - это новый стандарт для работы с датами и временем в JavaScript. Он решает проблемы старого Date: путаницу с часовыми поясами, неточности и сложности в коде. С Temporal разработчики получат точные инструменты без багов.
Зачем это нужно? Date часто подводит при международных проектах - один и тот же код работает по-разному в разных зонах. Temporal вводит четкие типы данных, чтобы избежать ошибок. Теперь можно легко конвертировать времена и форматировать даты правильно.
Что такое Temporal API и почему он лучше Date
Temporal API - это набор объектов для точной работы с временем. В отличие от Date, который смешивает понятия момента во времени и локальной даты, Temporal разделяет их. Есть Temporal.Instant для абсолютных моментов с наносекундной точностью и Temporal.PlainDate для простых дат без зоны.
Рассмотрим пример: представьте задачу с событием “4 июля 2025 в 15:00”. С Date это вызовет споры - в каком поясе? Temporal позволяет создать PlainDateTime без зоны, а потом привязать ZonedDateTime к конкретному региону. Так код становится предсказуемым и безопасным для глобальных приложений.
Это подводит к ключевым отличиям. Вот основные типы:
- Temporal.Instant - фиксированный момент в UTC, идеален для логов и сравнений.
- Temporal.PlainDate - дата без времени и зоны, как в календаре.
- Temporal.ZonedDateTime - дата-время с учетом часового пояса, с автоматической обработкой DST.
Свойство Date Temporal Точность Миллисекунды Наносекунды Зоны Частично, мутабельно Полная, неизменяемо Парсинг строк Ненадежный Строгий ISO 8601 Високосные годы Ручная проверка Встроенная (inLeapYear) Важно: Temporal неизменяемый - методы возвращают новые объекты, без мутаций.
Основные объекты Temporal: от Now до Instant
Temporal.Now дает текущие значения в разных форматах. Например, Temporal.Now.zonedDateTime(‘Europe/Moscow’) вернет локальное время с зоной. Это удобнее, чем new Date(), которое всегда в локальной зоне браузера.
Допустим, нужно получить время в нескольких зонах для дашборда. С Date пришлось бы вручную вычислять offset. Temporal делает это одной строкой: Temporal.Now.instant() для UTC-момента, потом конвертируем. Instant.from(‘1969-07-20T20:17Z’) создаст момент высадки на Луну точно.
Вот как работать с основными объектами:
- Получить сейчас:
Temporal.Now.plainDateTimeISO()- без зоны. - Создать из строки:
Temporal.PlainDate.from('2022-01-31')- просто дата. - С зоной:
Temporal.ZonedDateTime.from({timeZone: 'America/Los_Angeles', year: 1995, month: 12, day: 7}). - Конвертировать Date:
legacyDate.toTemporalInstant().
Сравним создание дат:
Задача Date код Temporal код Текущая дата new Date()Temporal.Now.plainDateISO()Послезавтра new Date(Date.now() + 2*86400000)Temporal.Now.plainDateISO().add({days: 2})Сравнение date1 > date2instant1.compare(instant2)Нюанс: Для обратной конверсии используйте epochMilliseconds из Instant.
Сравнение Date и Temporal на примерах
Date хорош для простых задач, но ломается на границах. Проверим високосный год: с Date - new Date(year, 1, 29).getDate() === 29. С Temporal - zonedDateTime.inLeapYear, проще и надежнее.
Возьмем реальный кейс: событие в Париже 14 июля 2020. Temporal.ZonedDateTime.from({timeZone: ‘Europe/Paris’, year: 2020, month: 7, day: 14}).toString() выдаст ‘2020-07-14T00:00:00+02:00[Europe/Paris]’. Date покажет разное в зависимости от локали.
Плюсы Temporal в практике:
- Безопасный парсинг - строки только в ISO, никаких ‘December 25, 1995’.
- Методы сравнения - compare() вместо > или < с рисками.
- Форматирование - через Intl или встроенное, с учетом локали.
Проблема Date Решение в Temporal DST сдвиги Автоматическая ZonedDateTime Мутации Все неизменяемо Неточности Наносекунды + микросекунды Совет: Для миграции проверяйте поддержку - if (typeof Temporal !== ‘undefined’).
Как начать использовать Temporal прямо сейчас
Temporal на стадии 4 TC39, скоро в браузерах. Уже можно тестировать с полифиллом @js-temporal/polyfill. Установите npm i @js-temporal/polyfill, импортируйте и расширьте Date.prototype.toTemporalInstant.
В проекте начните с внутренних вычислений на Temporal, а на границах оставьте Date. Так минимизируете риски. Пример: конвертируйте legacy Date в Instant для расчетов, верните Date для API.
Практические шаги внедрения:
- Установите полифилл.
- Замените new Date() на Temporal.Now для новых фич.
- Тестируйте зоны: создайте ZonedDateTime для ключевых регионов.
Взгляд в детали реализации Temporal
Temporal глубоко продуман. Объект Temporal содержит статические методы вроде Round, аналог Math. Now возвращает подтипы: plainDateTimeISO(), zonedDateTime(timeZone).
Для старого кода: Date.toTemporalInstant() и Instant.epochMilliseconds. Это мостик для постепенной замены. Полифилл добавляет 100-200 КБ, но без него - нативно нулевой вес.
Ключевые методы:
- add/d Subtract({days: 1, hours: 2})
- until/until({largestUnit: ‘months’})
- toLocaleString(locales, options)
Temporal меняет правила игры
Temporal устраняет 90% багов с датами, предлагая точные типы и зоны. Остается вопрос поддержки - пока полифиллы, но стандарт близко.
Дальше думайте о календарях: Temporal поддержит не только Gregorian, но и Japanese, Islamic. Это откроет двери для локализованных приложений без хаков.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.