<?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: революция в работе с датами и временем]]></title><description><![CDATA[<p dir="auto">Temporal API в ECMAScript 2026 меняет подход к датам и времени в JavaScript. Старый объект Date полон проблем - он мутабельный, не учитывает часовые пояса правильно и парсит строки непредсказуемо. Теперь Temporal предлагает <strong>иммутабельные</strong> объекты с поддержкой зон и календарей, что упрощает код и снижает баги.</p>
<p dir="auto">Это полезно для веб-приложений, где даты - частая головная боль. Temporal решает вопросы с летним временем, разными календарями и точными вычислениями. В статье разберем ключевые классы, примеры и сравнение с Date.</p>
<h2>Что такое Temporal API и почему он лучше Date</h2>
<p dir="auto">Temporal - это пространство имен в JavaScript, похожее на Intl, с классами для разных аспектов дат и времени. Оно создано с нуля, чтобы избежать ошибок старого Date: мутации, нестабильный парсинг строк и игнор часовых поясов. Например, Date.toString() зависит от локали системы, а Temporal всегда предсказуем.</p>
<p dir="auto">В ES2026 Temporal становится стандартом. Объекты <strong>иммутабельны</strong> - методы вроде add() или subtract() возвращают новые экземпляры, без побочных эффектов. Это идеально для многопоточного кода или состояний в React. Поддержка не-григорианских календарей и наносекунд делает его универсальным.</p>
<p dir="auto">Вот основные классы Temporal:</p>
<ul>
<li><strong>Temporal.Instant</strong>: точка на глобальной временной шкале, UTC.</li>
<li><strong>Temporal.ZonedDateTime</strong>: дата-время с часовым поясом.</li>
<li><strong>Temporal.PlainDateTime</strong>: дата-время без пояса.</li>
<li><strong>Temporal.PlainDate</strong>: только дата.</li>
<li><strong>Temporal.Now</strong>: методы для текущего времени.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Класс</th>
<th>Что представляет</th>
<th>Пример использования</th>
</tr>
</thead>
<tbody>
<tr>
<td>Instant</td>
<td>Момент в UTC</td>
<td>Фиксация события глобально</td>
</tr>
<tr>
<td>ZonedDateTime</td>
<td>Дата-время в поясе</td>
<td>Встречи с учетом DST</td>
</tr>
<tr>
<td>PlainDateTime</td>
<td>Локальная дата-время</td>
<td>Формы без пояса</td>
</tr>
<tr>
<td>PlainDate</td>
<td>Только дата</td>
<td>День рождения</td>
</tr>
</tbody>
</table>
<h2>Основные классы и их методы</h2>
<p dir="auto">Temporal.Now.zonal() возвращает ZonedDateTime в указанном поясе, а plainDateTime() - без него. Методы like until(), since() вычисляют разницу точно, с учетом DST. Классы сравнимы: Instant.compare() или equals() упрощают сортировку.</p>
<p dir="auto">Рассмотрим пример: создание даты 2026-03-04 12:00 в Москве. С Date пришлось бы вручную корректировать offset, рискуя ошибкой. Temporal.ZonedDateTime.from(‘2026-03-04T12:00:00[Europe/Moscow]’) делает это автоматически. Методы round() округляют до нужной точности.</p>
<p dir="auto">Ключевые методы для работы:</p>
<ul>
<li><em>add(duration)</em>: добавляет интервал, возвращает новый объект.</li>
<li><em>subtract(duration)</em>: вычитает, иммутабельно.</li>
<li><em>toString()</em>: ISO 8601 с наносекундами и поясом.</li>
<li><em>toLocaleString()</em>: локализация с календарем.</li>
<li><em>valueOf()</em>: для сравнений.</li>
</ul>
<p dir="auto"><strong>Важный нюанс</strong>: диапазон дат от -271821-04-20 до +275760-09-13, как у Date, но с точными лимитами.</p>
<h2>Примеры кода: от простого к сложному</h2>
<p dir="auto">Начнем с базового: const today = Temporal.Now.plainDate(); выдает текущую дату без времени. Для интервалов: const diff = start.until(end); возвращает Duration с годами, месяцами, секундами. Это лучше Date.getTime() разницы в миллисекундах.</p>
<p dir="auto">В реальном проекте для напоминаний о встречах: ZonedDateTime сравнивает с Now.instant(), учитывая пояс. Нет магии - все явно. Для баз данных: PlainDate сохраняет дату без времени, избегая смещений.</p>
<p dir="auto">Простые примеры:</p>
<ol>
<li>Текущая дата: <code>Temporal.Now.plainDate('iso8601').toString()</code> - ‘2026-03-04’.</li>
<li>Разница: <code>dt1.until(dt2)</code> - объект с полями years, months и т.д.</li>
<li>Округление: <code>dt.round({ largestUnit: 'hour' })</code> - до часа.</li>
</ol>
<p dir="auto">Сравнение производительности:</p>
<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>Точный ISO</td>
</tr>
<tr>
<td>Добавление</td>
<td>Мутация</td>
<td>Новый объект</td>
</tr>
<tr>
<td>Пояса</td>
<td>Ручной offset</td>
<td>Встроенный</td>
</tr>
<tr>
<td>Разница</td>
<td>Миллисекунды</td>
<td>Структурированная</td>
</tr>
</tbody>
</table>
<h2>Temporal в проектах: переход и практики</h2>
<p dir="auto">Миграция проста: замените new Date() на Temporal.PlainDateTime.from(). Браузеры вроде Chrome 144 уже поддерживают. Для Node.js - флаг или полифилл. <em>Нюанс</em>: старый код с Date.parse() сломается - парсер строгий.</p>
<p dir="auto">В фронтенде Temporal упрощает календари, чаты с таймстампами. На бэкенде - логи, scheduling. Комбинируйте с using для ресурсов вроде файлов с датами.</p>
<p dir="auto">Практики:</p>
<ul>
<li>Выбирайте класс по задаче: Instant для серверов, ZonedDateTime для UI.</li>
<li>Всегда указывайте пояс в ZonedDateTime.</li>
<li>Тестируйте на границах: DST, високосные годы.</li>
</ul>
<p dir="auto"><strong>Преимущества</strong>: меньше багов на 90%, код чище.</p>
<h2>За пределами базовых дат</h2>
<p dir="auto">Temporal открывает двери для продвинутых сценариев вроде финансовых расчетов или игр с временем. Осталось место для интеграций с Web APIs и кастомных календарей. Стоит поэкспериментировать с Pattern Matching из ES2026 для обработки дат.</p>
]]></description><link>https://forum.exlends.ru/topic/1065/temporal-api-v-ecmascript-2026-revolyuciya-v-rabote-s-datami-i-vremenem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:39:09 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1065.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Mar 2026 12:26:47 GMT</pubDate><ttl>60</ttl></channel></rss>