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

Temporal API в ECMAScript 2026: конец проблем с датами в JavaScript

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

    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 уже поддерживают. Переход постепенный, но код станет чище и надежнее сразу.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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