Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Temporal API: как новый стандарт изменит работу с датами в JavaScript

Temporal API: как новый стандарт изменит работу с датами в JavaScript

Запланировано Прикреплена Закрыта Перенесена JavaScript
temporal apijavascriptдаты
1 Сообщения 1 Постеры 48 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал в отредактировано
    #1

    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’) создаст момент высадки на Луну точно.

    Вот как работать с основными объектами:

    1. Получить сейчас: Temporal.Now.plainDateTimeISO() - без зоны.
    2. Создать из строки: Temporal.PlainDate.from('2022-01-31') - просто дата.
    3. С зоной: Temporal.ZonedDateTime.from({timeZone: 'America/Los_Angeles', year: 1995, month: 12, day: 7}).
    4. Конвертировать Date: legacyDate.toTemporalInstant().

    Сравним создание дат:

    Задача Date код Temporal код
    Текущая дата new Date() Temporal.Now.plainDateISO()
    Послезавтра new Date(Date.now() + 2*86400000) Temporal.Now.plainDateISO().add({days: 2})
    Сравнение date1 > date2 instant1.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. Это откроет двери для локализованных приложений без хаков.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы