<?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 на стадии 4: полноценная замена Date на Rust в ECMAScript 2026]]></title><description><![CDATA[<p dir="auto">Temporal API наконец-то выходит на стадию 4 в TC39 и становится полноценной частью ECMAScript 2026. Это современный инструмент для работы с датами и временем, который решает все проблемы legacy-объекта Date: мутабельность, кривой парсинг, хаос с часовыми поясами. Теперь разработчики получат immutable типы, точную обработку зон и календарей - без багов и сюрпризов.</p>
<p dir="auto">Зачем это нужно? Date десятилетиями мучил всех: один неверный вызов метода - и данные слетают, парсер путает форматы, а переходы на летнее время ломают логику. Temporal меняет правила игры, предлагая предсказуемое API. С ним проще строить приложения с международной поддержкой, от аналитики до планировщиков.</p>
<h2>Почему Date пора на пенсию</h2>
<p dir="auto">Объект Date в JavaScript - это relic из 90-х. Он мутирует состояние при простых операциях, вроде добавления часов, что приводит к ошибкам в многопоточных сценариях или при параллельных вычислениях. Парсинг строк работает непредсказуемо: ‘01/02/2026’ может стать 1 февраля или 2 января в зависимости от локали. Часовые пояса? Только UTC и локальный, без нормальной поддержки IANA-зон вроде ‘Europe/Moscow’.</p>
<p dir="auto">Temporal решает это радикально. Все объекты - неизменяемые, операции возвращают новые экземпляры. Парсер строг: только ISO-8601 без неоднозначностей. Поддержка всех зон времени и календарей из коробки, включая японский или исламский. Реализация на Rust (через temporal_rs) обеспечивает скорость и безопасность даже в V8.</p>
<p dir="auto">Плюс, Temporal уже работает в Chrome 144 и Firefox 139, Safari догоняет. К марту 2026 на встрече TC39 в Нью-Йорке ожидают апрув Stage 4 - и вот оно, стандарт ES2026.</p>
<ul>
<li><strong>Immutable операции</strong>: <code>const tomorrow = today.add({ days: 1 })</code> - оригинал не меняется.</li>
<li><strong>Точные зоны</strong>: <code>Temporal.ZonedDateTime.from('2026-03-10T12:00[Europe/Moscow]')</code>.</li>
<li><strong>Безопасный парсинг</strong>: Никаких сюрпризов с ‘MM/DD’ vs ‘DD/MM’.</li>
<li><strong>Rust-бэкенд</strong>: Общая библиотека для V8, Boa и Kiesel - единое поведение.</li>
</ul>
<h2>Основные типы в Temporal API</h2>
<p dir="auto">Temporal - это не один класс, а набор специализированных типов под задачи. <code>Temporal.PlainDate</code> для дат без времени, <code>Temporal.PlainTime</code> для времени без даты, <code>Temporal.ZonedDateTime</code> для полного datetime с зоной. Каждый тип фокусируется на своей роли, избегая перегрузки как в Date.</p>
<p dir="auto">Пример: нужно посчитать разницу между встречами в разных зонах. С Date пришлось бы вручную конвертировать в миллисекунды, рискуя ошибками DST. В Temporal: <code>zoned1.until(zoned2)</code> вернет <code>Temporal.Duration</code> с днями, часами, минутами - точно и без мутаций. Арифметика работает с учетом календарей: добавь год к 28 февраля в високосный - получишь правильный день.</p>
<p dir="auto">Это упрощает код в библиотеках вроде scheduling или analytics. Форматирование через <code>toLocaleString</code> интегрируется с Intl API, поддерживая локали.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Тип</th>
<th>Описание</th>
<th>Пример использования</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>PlainDate</strong></td>
<td>Дата без времени</td>
<td><code>Temporal.PlainDate.from('2026-03-10')</code></td>
</tr>
<tr>
<td><strong>PlainTime</strong></td>
<td>Время без даты</td>
<td><code>Temporal.PlainTime.from('12:00:00')</code></td>
</tr>
<tr>
<td><strong>ZonedDateTime</strong></td>
<td>Дата-время с зоной</td>
<td><code>Temporal.Now.zonedDateTimeISO('UTC')</code></td>
</tr>
<tr>
<td><strong>Instant</strong></td>
<td>Момент в UTC</td>
<td><code>Temporal.Instant.from('2026-03-10T12:00:00Z')</code></td>
</tr>
<tr>
<td><strong>Duration</strong></td>
<td>Интервал</td>
<td><code>date1.until(date2)</code></td>
</tr>
</tbody>
</table>
<ul>
<li><code>Temporal.Instant</code> - для точных моментов, игнорирует календари.</li>
<li><code>Temporal.Calendar</code> - абстракция для не-григорианских систем.</li>
<li><em>Нюанс</em>: Диапазон дат от -271821 до +275760 года - хватит на века.</li>
</ul>
<h2>Сравнение Date и Temporal на примерах</h2>
<p dir="auto">Возьмем типичную задачу: парсим строку, добавляем час, выводим в локальной зоне. С Date: <code>new Date(isoString)</code> может сдвинуть время из-за локали, <code>setHours</code> мутирует объект. Результат? Баги в проде.</p>
<p dir="auto">Temporal чище: <code>Temporal.Instant.from(isoString).toZonedDateTimeISO('Africa/Johannesburg')</code> - и вуаля, точный вывод с оффсетом. Арифметика: <code>zonedDateTime.add({ hours: 1 })</code> создает новый объект, без побочек.</p>
<p dir="auto">В production это спасает от edge-кейсов вроде DST или високосных лет. Библиотеки начнут мигрировать: scheduling-аппы выиграют от <code>Duration</code>.</p>
<pre><code class="language-javascript">// Date - старый способ
new Date('2026-03-20T23:00:00Z').toString(); // Sat Mar 21 2026 01:00:00 GMT+0200

// Temporal - новый
Temporal.Instant.from('2026-03-20T23:00:00Z')
  .toZonedDateTimeISO('Africa/Johannesburg')
  .toString({ timeZoneName: 'never' }); // 2026-03-21T01:00:00+02:00
</code></pre>
<ul>
<li><strong>Преимущества Temporal</strong>: Immutable, зоны, календари, надежный парсер.</li>
<li><strong>Минусы Date</strong>: Мутации, неоднозначный парсинг, слабые зоны.</li>
<li><em>Важно</em>: Date остается для legacy, но новый код - на Temporal.</li>
</ul>
<h2>Что скрывают лимиты Temporal</h2>
<p dir="auto">Несмотря на мощь, есть рамки. Диапазон ±10^8 дней от эпохи - для большинства хватит, но астрономы подумают. Нет наносекунд в PlainDate, только в Instant. Safari еще тестирует, так что полифиллы нужны для full cross-browser.</p>
<p dir="auto">TC39 учел фидбек: Stage 3 дал стабильность, Stage 4 - финал. Rust-имплементация ускоряет движки, минимизируя расхождения. В ES2026 Temporal - стандарт, но миграция библиотек займет время: смотрите на GitHub-репо для обновлений.</p>
<p dir="auto">Подумайте о календарях: Temporal открывает двери для азиатских или религиозных систем без хаков. А как это повлияет на Node.js или Deno? Здесь простор для экспериментов, пока экосистема адаптируется.</p>
]]></description><link>https://forum.exlends.ru/topic/1530/temporal-api-na-stadii-4-polnocennaya-zamena-date-na-rust-v-ecmascript-2026</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 04:07:27 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1530.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Mar 2026 06:38:25 GMT</pubDate><ttl>60</ttl></channel></rss>