<?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 в ECMAScript 2026: конец проблем с датами в JavaScript]]></title><description><![CDATA[<p dir="auto">Temporal API в ECMAScript 2026 меняет подход к датам и времени в JavaScript. Старый объект Date полон ловушек - мутации, проблемы с часовыми поясами и неудобный API. Теперь с Temporal эти боли уходят: immutable объекты, полная поддержка зон и календарей.</p>
<p dir="auto">Это полезно для всех, кто работает с расписаниями, логами или международными проектами. Temporal дает точность и предсказуемость, без багов от DST или неправильных парсингов. Давайте разберем, как это работает на практике.</p>
<h2>Что не так с Date и как Temporal все исправляет</h2>
<p dir="auto">Объект Date в JavaScript - это реликвия 90-х. Он мутирует при любом изменении, путает локальные зоны с UTC и не умеет работать с датами без времени. Например, new Date() зависит от системных настроек, а getDate() может дать неожиданный результат из-за перехода на летнее время.</p>
<p dir="auto">Temporal вводит namespace с классами вроде PlainDate, ZonedDateTime и Instant. Эти объекты неизменяемы: вызов метода возвращает новый экземпляр, не трогая оригинал. Поддержка всех зон через IANA и календарей вроде японского или исламского - из коробки. Нет больше гаданий о формате строки - парсинг по RFC 9557 с наносекундами.</p>
<p dir="auto">Вот ключевые отличия:</p>
<ul>
<li><strong>PlainDate</strong> хранит только дату (год-месяц-день), без времени.</li>
<li><strong>PlainTime</strong> - только время, без даты.</li>
<li><strong>ZonedDateTime</strong> учитывает зону и DST автоматически.</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>Да, immutable</td>
</tr>
<tr>
<td>Часовые пояса</td>
<td>Частично, с UTC</td>
<td>Полная поддержка IANA</td>
</tr>
<tr>
<td>Календари</td>
<td>Только григорианский</td>
<td>Любые, включая буддистский</td>
</tr>
<tr>
<td>Точность</td>
<td>Миллисекунды</td>
<td>Наносекунды</td>
</tr>
</tbody>
</table>
<h2>Основные классы Temporal на примерах</h2>
<p dir="auto">Temporal.Now - точка входа для текущего времени. Temporal.Now.plainDateISO() вернет PlainDate на сегодня в ISO-формате. Никаких new Date() с сюрпризами. Для zoned времени: Temporal.Now.zonedDateTimeISO(‘Europe/Moscow’).</p>
<p dir="auto">Представьте задачу: добавить 3 дня к дате. С Date это setDate(getDate() + 3), что сломает месяц. В Temporal: date.add({ days: 3 }) - просто и безопасно. Subtract работает аналогично для вычитания. Методы since() и until() считают разницу как Duration.</p>
<ul>
<li><strong>Instant</strong>: момент в UTC, идеален для логов. Instant.from(‘2026-03-05T07:00:00Z’).</li>
<li><em>PlainDateTime</em>: дата + время без зоны, для локальных событий.</li>
<li><strong>ZonedDateTime</strong>: полная дата-время-зона, с round() для округления.</li>
</ul>
<pre><code class="language-javascript">const today = Temporal.Now.plainDateISO();
const future = today.add({ days: 7 });
console.log(future.toString()); // 2026-03-12
</code></pre>
<h2>Работа с duration и сравнениями</h2>
<p dir="auto">Duration - класс для интервалов: { years: 1, months: 2, days: 3 }. AddDurationToDate() добавляет его к дате с учетом календаря. Никаких переполнений месяцев - Temporal нормализует.</p>
<p dir="auto">Сравнения просты: date1.equals(date2) или compare(). Для сортировки массивов дат - Instant.compare(). toJSON() и toString() дают стандартные форматы, совместимые с JSON.</p>
<p dir="auto">Преимущества в таблице:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Операция</th>
<th>Пример кода</th>
</tr>
</thead>
<tbody>
<tr>
<td>Добавить неделю</td>
<td>date.add({ weeks: 1 })</td>
</tr>
<tr>
<td>Разница</td>
<td>date1.until(date2)</td>
</tr>
<tr>
<td>Округлить</td>
<td>dt.round({ nearestTo: ‘hour’ })</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>until()</strong> возвращает Duration между датами.<br />
<em>Важно</em>: options для overflow - ‘constrain’ или ‘reject’.</li>
<li><strong>round()</strong> полезен для финансовых вычислений.</li>
</ul>
<h2>Temporal в реальных проектах</h2>
<p dir="auto">В фронтенде Temporal упрощает календари и формы. Бекенд получает точные timestamps без библиотеки Luxon или Day.js. Мобильные apps с intl работают с локализацией через toLocaleString().</p>
<p dir="auto">Пример расписания:</p>
<pre><code class="language-javascript">const event = Temporal.ZonedDateTime.from('2026-03-05T10:00:00[Europe/Moscow]');
const end = event.add({ hours: 2 });
</code></pre>
<p dir="auto">Короткие типы вроде PlainYearMonth для подписок или PlainMonthDay для дней рождения. Диапазон дат - от -271821 года до +275760, хватит на века.</p>
<h2>Новые горизонты с Temporal</h2>
<p dir="auto">Temporal закрывает 90% кейсов без внешних либ. Осталось доработать интеграцию с Web APIs и производительность в старых движках. Стоит поэкспериментировать с календарями вроде ‘islamic’ для глобальных проектов.</p>
<p dir="auto">В ECMAScript 2026 это стандарт - Chrome, Firefox и Safari уже поддерживают. Переход постепенный, но код станет чище и надежнее сразу.</p>
]]></description><link>https://forum.exlends.ru/topic/1117/temporal-api-v-ecmascript-2026-konec-problem-s-datami-v-javascript</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:54:17 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1117.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2026 07:04:22 GMT</pubDate><ttl>60</ttl></channel></rss>