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

Temporal API достиг стадии 4: конец эпохи Date в JavaScript

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

    Temporal API наконец-то вышел на стадию 4 в TC39. Это значит, что он официально войдет в стандарт ECMAScript, и объект Date уйдет в прошлое. Разработчики получат надежный инструмент для работы с датами, временем и часовыми поясами без багов и путаницы.

    Сейчас многие проекты мучаются с Date из-за его неявного поведения и ошибок в парсинге. Temporal решает эти проблемы строгим API и отдельными типами данных. Это упростит код, сделает его предсказуемым и избавит от лишних библиотек вроде Moment.js.

    Почему Date - это вечная головная боль

    Объект Date в JavaScript создавался в 90-х и копировал Java, но без учета реальной сложности дат. Он хранит время как миллисекунды от Unix-эпохи, но парсит строки странно: ‘03/04/2023’ может быть мартом или апрелем в зависимости от локали. Мутации через set методы ломают иммутабельность, а часовые пояса обрабатываются криво.

    Представьте: вы пишете логику для международного приложения, и вдруг дата сдвигается из-за DST. Date не различает календарную дату и момент во времени, что приводит к ошибкам в 30% случаев по тестам. Temporal разделяет эти понятия на классы, делая код явным и безопасным. Это не просто апгрейд - это переосмысление проблемы.

    • Парсинг строк: Date(‘2023-03-04’) предполагает UTC, но локальные строки парсятся по браузеру. Temporal.Now.zonedDateTimeISO() всегда четко.
    • Мутации: date.setFullYear() меняет объект на месте. В Temporal объекты неизменяемы - withFullYear() возвращает новый.
    • Часовые поясы: Date.toString() игнорирует IANA-зоны. Temporal.ZonedDateTime использует их нативно.
    Проблема Date Temporal
    Парсинг Неоднозначный, локаль-зависимый Строгий, с валидацией
    Иммутабельность Мутации на месте Всегда новые объекты
    Пояса Ограниченная поддержка Полная IANA, offsets
    Точность Миллисекунды Наносекунды

    Основные классы Temporal: что внутри

    Temporal - это не один объект, а набор классов для разных задач. Temporal.Instant - точка на шкале Unix-времени, Temporal.PlainDate - календарная дата без времени. ZonedDateTime добавляет пояс, а Duration - интервалы. Каждый класс имеет методы вроде until() для разниц или add() для арифметики.

    Например, создание текущего момента: Temporal.Now.instant() дает точное время с наносекундами. Сравните с new Date(), где точность ниже. Форматирование через toLocaleString() учитывает локаль правильно, без хаков. Это делает API интуитивным для повседневных задач вроде фильтров по датам в UI.

    • Temporal.Instant: Для моментов во времени. Temporal.Instant.from('2023-03-04T12:00Z') - просто и точно.
    • Temporal.PlainDate: Чистая дата. Temporal.PlainDate.from({'year': 2023, 'month': 3, 'day': 4}) - порядок не важен.
    • Temporal.Duration: Интервалы. new Temporal.Duration(1, 2, 3) - годы, месяцы, дни.
    • Temporal.ZonedDateTime: С поясом. Temporal.Now.zonedDateTime('Europe/Moscow').

    Сравнение Date и Temporal на примерах

    Возьмем задачу: вычислить разницу между датами с учетом пояса. В Date: new Date(‘2023-03-04T12:00+03:00’) минус new Date(‘2023-03-03T12:00+00:00’) даст миллисекунды, но с хаком для дней. Temporal: zoned1.until(zoned2, {largestUnit: ‘days’}) вернет {days: 1} чисто.

    Другая боль - арифметика. Date.addHours() нет, приходится вручную. Temporal.PlainDate.from() .add({hours: 2}) создает новый объект без мутаций. В проектах с расписаниями или отчетами это сэкономит часы дебага. Полифиллы уже готовы для продакшена, так что тестировать можно сейчас.

    // Date
    let d = new Date('2023-03-04');
    d.setDate(5); // Мутация!
    
    // Temporal
    const date = Temporal.PlainDate.from('2023-03-04');
    const newDate = date.add({days: 1}); // Новый объект
    date.equals(newDate); // false
    
    Задача Date код Temporal код
    Текущая дата new Date() Temporal.Now.plainDateISO()
    Разница getTime() diff until({unit: ‘hours’})
    Пояс getTimezoneOffset() zonedDateTime(‘UTC’)
    Формат toISOString() toLocaleString(‘ru’)

    Стадия 4: что меняется в движках

    Temporal на стадии 4 - это сигнал для браузеров: Firefox уже имеет, V8 в Chromium 144 интегрирует. Safari и полифиллы @js-temporal/polyfill покрывают остальное. Спецификация прошла тысячи тестов, упростилась для стабильности. Размер API большой, но встроенный - лучше 100 КБ Moment.js.

    Миграция постепенная: старый код работает, новый использует Temporal. TC39 ожидает ECMAScript 2026 с ним. Это конец эры, когда даты - источник багов 20% проектов.

    Взгляд в код: переход на Temporal

    Начните с простого: замените new Date() на Temporal.Now.instant(). Для дат - PlainDate, для событий - ZonedDateTime. Проверяйте типы: instanceof Temporal.PlainDate. Инструменты вроде ESLint уже имеют правила для миграции. В больших командах это ускорит ревью.

    Пример конвертации строки: Temporal.PlainDate.from(‘2023-03-04’) валидирует, Date - нет. Until() и since() дают разности в нужных единицах. Сравнения < > работают между типами с coerce. Это делает Temporal гибким для legacy-кода.

    • Миграция шаг 1: Заменить парсинг на from() методы.
    • Шаг 2: Использовать with() вместо set*().
    • Шаг 3: Добавить пояса через zonedDateTime().

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

    Полифиллы стабильны, V8-библиотека 0.1 проходит тесты. Точность до наносекунд полезна для финансов и логов. Минус - размер бандла +5-10% из-за нативки, но без внешних deps. Календари вроде японского или исламского поддерживаются.

    Важно: Temporal не ретрофит Date - новый namespace. Hybrid-подход: if (Temporal) use it. Тесты показывают 90% меньше ошибок в датах.

    Браузер Статус Полифилл
    Firefox Полная Не нужен
    Chrome 144+ Полная @js-temporal
    Safari В разработке polyfill

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

    Стадия 4 закрывает 10-летний цикл разработки. Date останется для простоты, но Temporal - стандарт для серьезных задач. Останутся вопросы по производительности в edge-кейсах и интеграции с Web APIs. Стоит изучить документацию и потестировать в проектах - будущее уже здесь.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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