<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Temporal API: как JavaScript решает проблемы с датами и временем]]></title><description><![CDATA[<p dir="auto">Temporal API - это новый стандарт в JavaScript для работы с датами и временем. Он решает хронические проблемы Date: мутабельность, путаницу с часовыми поясами и ненадежный парсинг строк. Теперь разработчики получают надежные классы для точных вычислений.</p>
<p dir="auto">С Temporal код становится предсказуемым и безопасным. Нет больше неожиданных изменений дат или ошибок из-за DST. Это упрощает жизнь фронтенд-разработчикам, особенно в приложениях с расписаниями и событиями.</p>
<h2>Почему Date устарел и как Temporal его заменяет</h2>
<p dir="auto">Классический объект Date в JavaScript мутирует значения при операциях, что приводит к багам. Например, добавление дня к 31 декабря меняет исходную дату, и завтрашний день может стать сегодняшним. Парсинг строк вроде “2025-04-09” работает нестабильно - иногда как UTC, иногда как локальное время.</p>
<p dir="auto">Temporal вводит иммутабельные классы: все методы возвращают новые объекты, а не меняют старые. Это делает код проще для понимания и отладки. Плюс встроенная поддержка часовых поясов и календарей - никаких внешних библиотек вроде Moment.js.</p>
<ul>
<li><strong>PlainDate</strong>: дата без времени и пояса, идеальна для дней рождения или сроков. Пример: <code>Temporal.PlainDate.from('2025-04-09')</code> дает объект с <code>year</code>, <code>month</code>, <code>day</code>.</li>
<li><strong>PlainTime</strong>: только время, без даты. Полезно для расписаний: <code>Temporal.PlainTime.from('14:30:00')</code>.</li>
<li><strong>ZonedDateTime</strong>: дата-время с поясом, автоматически учитывает DST. <code>Temporal.Now.zonedDateTimeISO('Europe/Moscow')</code>.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Свойство Date</th>
<th>Проблема</th>
<th>Temporal решение</th>
</tr>
</thead>
<tbody>
<tr>
<td>Мутации</td>
<td><code>setDate()</code> меняет объект</td>
<td>Иммутабельность, новые объекты</td>
</tr>
<tr>
<td>Часовые пояса</td>
<td>Неявный локальный</td>
<td>Явные <code>ZonedDateTime</code></td>
</tr>
<tr>
<td>Парсинг</td>
<td>Ненадежный</td>
<td>Строгий ISO 8601</td>
</tr>
</tbody>
</table>
<h2>Основные классы Temporal для повседневных задач</h2>
<p dir="auto">Temporal.Now - это точка входа для текущего времени. <code>Temporal.Now.plainDateISO()</code> вернет сегодняшнюю дату без лишнего, а <code>Temporal.Now.instant()</code> - момент в UTC с наносекундами. Это удобно для логов или API-запросов.</p>
<p dir="auto">Duration позволяет считать разницу между датами. Добавление интервалов не ломает логику - API сам обрабатывает переходы месяцев. Например, 31 января + 1 месяц становится 28 февраля в невисокосный год, без ошибок.</p>
<p dir="auto">Вот примеры создания и операций:</p>
<ul>
<li><code>const date = Temporal.PlainDate.from({year: 2025, month: 4, day: 9}); date.add({days: 1});</code> - добавляет день, возвращает новый объект.</li>
<li><code>const duration = date.until(Temporal.Now.plainDateISO());</code> - разница в днях, месяцах.</li>
<li><strong>Instant</strong>: точный момент глобально. <code>Temporal.Instant.fromEpochSeconds(1234567890)</code> для timestamp.</li>
</ul>
<p dir="auto"><strong>Ключевой плюс</strong>: все классы поддерживают цепочки методов, как <code>date.with({month: 5}).add({years: 1})</code>.</p>
<h2>Работа с часовыми поясами и календарями</h2>
<p dir="auto">Часовые пояса - вечный кошмар Date. В Temporal они задаются явно: ‘America/New_York’ или ‘Asia/Tokyo’. <code>ZonedDateTime</code> конвертирует времена автоматически, учитывая летнее время.</p>
<p dir="auto">Поддержка не-григорианских календарей открывает двери для локализации. PlainDate работает с буддистским или исламским календарем через опции. Это актуально для глобальных приложений.</p>
<p dir="auto">Практические примеры:</p>
<ol>
<li>Текущее время в Москве: <code>Temporal.Now.zonedDateTimeISO('Europe/Moscow').toString()</code> - ‘2026-03-02T12:00:00+03:00[Europe/Moscow]’.</li>
<li>Конверсия: <code>zoned.withTimeZone('UTC')</code> - меняет пояс без сдвига момента.</li>
<li><em>Нюанс</em>: неоднозначности DST разрешаются опциями ‘earliest’ или ‘latest’.</li>
</ol>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Класс</th>
<th>Когда использовать</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td>PlainDateTime</td>
<td>Локальное дата-время</td>
<td>События без пояса</td>
</tr>
<tr>
<td>ZonedDateTime</td>
<td>Глобальные встречи</td>
<td>Zoom с разными зонами</td>
</tr>
<tr>
<td>Duration</td>
<td>Расчеты интервалов</td>
<td>Сроки задач</td>
</tr>
</tbody>
</table>
<h2>Temporal в production: что дает на практике</h2>
<p dir="auto">Temporal уже в Chrome 144 и Firefox Nightly, полная поддержка ожидается в 2026. Заменяет библиотеки, снижая бандл-сайз. Код чище: нет геттеров-сеттеров, все declarative.</p>
<p dir="auto">Для фронтенда это прорыв в календарях, чатах, e-commerce. Вычисления предсказуемы, тесты проще. Осталось дождаться полифиллов для старых браузеров и инструментов вроде TypeScript.</p>
<p dir="auto">Можно углубиться в редкие случаи: нестандартные календари или микросекундную точность. Или подумать, как Temporal интегрируется с Web APIs вроде Intl.</p>
]]></description><link>https://forum.exlends.ru/topic/910/temporal-api-kak-javascript-reshaet-problemy-s-datami-i-vremenem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:25:09 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/910.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Mar 2026 12:06:46 GMT</pubDate><ttl>60</ttl></channel></rss>