<?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 достигает stage 4: как новая дата и время заменят Date в JavaScript]]></title><description><![CDATA[<p dir="auto">Temporal API наконец-то достиг stage 4 в TC39. Это значит, что современная работа с датами и временем в JavaScript выходит из стадии экспериментов. Новая библиотека решает ключевые проблемы старого Date: мутации, путаницу с часовыми поясами и неудобный API.</p>
<p dir="auto">Зачем это нужно разработчикам? Старый Date часто приводит к багам в проектах с разными часовыми поясами или календарями. Temporal предлагает неизменяемые объекты, точную обработку интервалов и нативную поддержку IANA timezone. Теперь можно забыть про библиотеки вроде date-fns или dayjs - браузеры сами справятся.</p>
<h2>Проблемы Date и почему пора менять</h2>
<p dir="auto">Старый Date в JavaScript работает как timestamp с методами для компонентов даты. Но он мутирует состояние, путает локальное время с UTC и не поддерживает durations или intervals напрямую. Например, new Date(‘2025-04-03’) парсится как локальное время, а не ISO-дата, что ломает логику в разных зонах.</p>
<p dir="auto">Temporal меняет подход: вводит namespace с классами вроде PlainDate, ZonedDateTime и Instant. Все объекты неизменяемые - вызовы методов возвращают новые экземпляры. Это устраняет side effects. К тому же, поддержка стандартов ISO-8601, RFC9557 и IANA делает парсинг предсказуемым.</p>
<p dir="auto">Вот типичные проблемы Date:</p>
<ul>
<li><em>Мутация</em>: date.setFullYear() меняет объект на месте.</li>
<li><em>Часовые пояса</em>: Нет нативной поддержки, приходится хакать с UTC.</li>
<li><em>Парсинг</em>: new Date() не всегда следует ISO строго.</li>
<li><em>Отсутствие durations</em>: Нет встроенного способа считать P1D или PT1H.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сравнение</th>
<th>Date</th>
<th>Temporal</th>
</tr>
</thead>
<tbody>
<tr>
<td>Неизменяемость</td>
<td>Нет</td>
<td>Да</td>
</tr>
<tr>
<td>Timezone</td>
<td>Частично</td>
<td>Полная (IANA)</td>
</tr>
<tr>
<td>Durations</td>
<td>Нет</td>
<td>Native</td>
</tr>
<tr>
<td>Парсинг строк</td>
<td>Нестабильный</td>
<td>RFC9557/ISO</td>
</tr>
</tbody>
</table>
<h2>Ключевые классы Temporal</h2>
<p dir="auto">Temporal - это набор классов для разных сценариев. PlainDate хранит только дату без времени, ZonedDateTime - дату, время и пояс. Instant фиксирует момент в UTC. Каждый класс следует RFC9557: YYYY-MM-DDTHH:mm:ss.sssssssssZ[zone].</p>
<p dir="auto">Пример: Temporal.PlainDate.from(‘2025-04-03’) дает чистую дату без зоны. Для полной картины используй ZonedDateTime.from(‘2025-04-03T00:00Z[UTC]’). Это удобно для серверов, где время всегда в UTC, но клиенты видят локальное.</p>
<p dir="auto"><strong>Основные классы:</strong></p>
<ul>
<li><strong>Temporal.PlainDate</strong>: Дата (год-месяц-день), календарные операции.</li>
<li><strong>Temporal.ZonedDateTime</strong>: Дата-время с поясом, учитывает DST.</li>
<li><strong>Temporal.Instant</strong>: Абсолютный момент, как Unix timestamp в наносекундах.</li>
<li><strong>Temporal.Duration</strong>: Интервалы вроде ‘P1Y2M’ или ‘PT3H30M’, арифметика.</li>
</ul>
<p dir="auto"><em>Нюанс</em>: Диапазон - от -271821-04-20 до +275760-09-13, как у Date.</p>
<p dir="auto">Пример кода:</p>
<pre><code class="language-javascript">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
</code></pre>
<h2>Работа с durations и зонами</h2>
<p dir="auto">Durations в Temporal - это объекты для сложной арифметики. add(‘P1D’) к ZonedDateTime учитывает переходы DST - добавит календарный день, а не 24 часа. Это критично для расписаний: концерт в 18:00[Europe/Dublin] останется в 18:00 даже после смены времени.</p>
<p dir="auto">Методы вроде .add() и .subtract() принимают DurationLike или опции. Temporal.Now.instant() дает текущий момент с наносекундами. Конвертация зон: zoned.withTimeZone(‘America/New_York’) создает новый объект без мутаций.</p>
<p dir="auto"><strong>Примеры операций:</strong></p>
<ol>
<li>Добавь день: zdt.add(‘P1D’).toString() -&gt; Учитывает зону.</li>
<li>Duration из двух дат: date1.until(date2) -&gt; ‘P2W3D’.</li>
<li>Текущее время: Temporal.Now.zonedDateTimeISO(‘UTC’).</li>
</ol>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Операция</th>
<th>Date эквивалент</th>
<th>Temporal</th>
</tr>
</thead>
<tbody>
<tr>
<td>+1 день</td>
<td>setDate + get</td>
<td>.add({days:1})</td>
</tr>
<tr>
<td>Разница</td>
<td>getTime() diff</td>
<td>.until()</td>
</tr>
<tr>
<td>Зона</td>
<td>Manual</td>
<td>.withTimeZone()</td>
</tr>
</tbody>
</table>
<h2>Готовность к продакшену</h2>
<p dir="auto">Temporal на stage 4 - spec стабилен, браузеры внедряют. Firefox уже поддерживает, Deno за флагом, Chrome в пути. Требование: две совместимые имплементации с тестами. Пока используй polyfill для старых сред.</p>
<p dir="auto">Интеграция с Intl для локализации: Intl.DateTimeFormat работает с Temporal. Нет нужды тащить библиотеки - браузеры везут IANA данные.</p>
<p dir="auto"><strong>Что проверить:</strong></p>
<ul>
<li>Поддержка в target браузерах.</li>
<li>Polyfill для legacy.</li>
<li>Тесты на DST и leap seconds (Temporal их игнорирует).</li>
</ul>
<h2>Temporal меняет правила игры</h2>
<p dir="auto">Temporal закрывает пробелы Date, делая JS конкурентным в enterprise. Осталось дождаться полной поддержки в Chrome - тогда мигрировать станет проще. Подумайте о рефакторинге: начните с PlainDate для дат без времени, перейдите на ZonedDateTime для глобальных apps.</p>
<p dir="auto">Дальше - полировка edge-кейсов вроде редких календарей или наносекунд в базах. Это не конец, но солидный шаг к надежному datetime в вебе.</p>
]]></description><link>https://forum.exlends.com/topic/1557/temporal-api-dostigaet-stage-4-kak-novaya-data-i-vremya-zamenyat-date-v-javascript</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 11:23:26 GMT</lastBuildDate><atom:link href="https://forum.exlends.com/topic/1557.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Mar 2026 11:12:43 GMT</pubDate><ttl>60</ttl></channel></rss>