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

Temporal API достигает stage 4: как новая дата и время заменят Date в JavaScript

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

    Temporal API наконец-то достиг stage 4 в TC39. Это значит, что современная работа с датами и временем в JavaScript выходит из стадии экспериментов. Новая библиотека решает ключевые проблемы старого Date: мутации, путаницу с часовыми поясами и неудобный API.

    Зачем это нужно разработчикам? Старый Date часто приводит к багам в проектах с разными часовыми поясами или календарями. Temporal предлагает неизменяемые объекты, точную обработку интервалов и нативную поддержку IANA timezone. Теперь можно забыть про библиотеки вроде date-fns или dayjs - браузеры сами справятся.

    Проблемы Date и почему пора менять

    Старый Date в JavaScript работает как timestamp с методами для компонентов даты. Но он мутирует состояние, путает локальное время с UTC и не поддерживает durations или intervals напрямую. Например, new Date(‘2025-04-03’) парсится как локальное время, а не ISO-дата, что ломает логику в разных зонах.

    Temporal меняет подход: вводит namespace с классами вроде PlainDate, ZonedDateTime и Instant. Все объекты неизменяемые - вызовы методов возвращают новые экземпляры. Это устраняет side effects. К тому же, поддержка стандартов ISO-8601, RFC9557 и IANA делает парсинг предсказуемым.

    Вот типичные проблемы Date:

    • Мутация: date.setFullYear() меняет объект на месте.
    • Часовые пояса: Нет нативной поддержки, приходится хакать с UTC.
    • Парсинг: new Date() не всегда следует ISO строго.
    • Отсутствие durations: Нет встроенного способа считать P1D или PT1H.
    Сравнение Date Temporal
    Неизменяемость Нет Да
    Timezone Частично Полная (IANA)
    Durations Нет Native
    Парсинг строк Нестабильный RFC9557/ISO

    Ключевые классы Temporal

    Temporal - это набор классов для разных сценариев. PlainDate хранит только дату без времени, ZonedDateTime - дату, время и пояс. Instant фиксирует момент в UTC. Каждый класс следует RFC9557: YYYY-MM-DDTHH:mm:ss.sssssssssZ[zone].

    Пример: Temporal.PlainDate.from(‘2025-04-03’) дает чистую дату без зоны. Для полной картины используй ZonedDateTime.from(‘2025-04-03T00:00Z[UTC]’). Это удобно для серверов, где время всегда в UTC, но клиенты видят локальное.

    Основные классы:

    • Temporal.PlainDate: Дата (год-месяц-день), календарные операции.
    • Temporal.ZonedDateTime: Дата-время с поясом, учитывает DST.
    • Temporal.Instant: Абсолютный момент, как Unix timestamp в наносекундах.
    • Temporal.Duration: Интервалы вроде ‘P1Y2M’ или ‘PT3H30M’, арифметика.

    Нюанс: Диапазон - от -271821-04-20 до +275760-09-13, как у Date.

    Пример кода:

    let date = Temporal.PlainDate.from('2025-04-03');
    let zoned = Temporal.ZonedDateTime.from('2025-04-03T12:00[Europe/Moscow]');
    let nextDay = date.add({ days: 1 }); // Новый объект!
    console.log(nextDay.toString()); // 2025-04-04
    

    Работа с durations и зонами

    Durations в Temporal - это объекты для сложной арифметики. add(‘P1D’) к ZonedDateTime учитывает переходы DST - добавит календарный день, а не 24 часа. Это критично для расписаний: концерт в 18:00[Europe/Dublin] останется в 18:00 даже после смены времени.

    Методы вроде .add() и .subtract() принимают DurationLike или опции. Temporal.Now.instant() дает текущий момент с наносекундами. Конвертация зон: zoned.withTimeZone(‘America/New_York’) создает новый объект без мутаций.

    Примеры операций:

    1. Добавь день: zdt.add(‘P1D’).toString() -> Учитывает зону.
    2. Duration из двух дат: date1.until(date2) -> ‘P2W3D’.
    3. Текущее время: Temporal.Now.zonedDateTimeISO(‘UTC’).
    Операция Date эквивалент Temporal
    +1 день setDate + get .add({days:1})
    Разница getTime() diff .until()
    Зона Manual .withTimeZone()

    Готовность к продакшену

    Temporal на stage 4 - spec стабилен, браузеры внедряют. Firefox уже поддерживает, Deno за флагом, Chrome в пути. Требование: две совместимые имплементации с тестами. Пока используй polyfill для старых сред.

    Интеграция с Intl для локализации: Intl.DateTimeFormat работает с Temporal. Нет нужды тащить библиотеки - браузеры везут IANA данные.

    Что проверить:

    • Поддержка в target браузерах.
    • Polyfill для legacy.
    • Тесты на DST и leap seconds (Temporal их игнорирует).

    Temporal меняет правила игры

    Temporal закрывает пробелы Date, делая JS конкурентным в enterprise. Осталось дождаться полной поддержки в Chrome - тогда мигрировать станет проще. Подумайте о рефакторинге: начните с PlainDate для дат без времени, перейдите на ZonedDateTime для глобальных apps.

    Дальше - полировка edge-кейсов вроде редких календарей или наносекунд в базах. Это не конец, но солидный шаг к надежному datetime в вебе.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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