<?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[Kiesel на Rust: универсальная реализация Temporal API]]></title><description><![CDATA[<p dir="auto">Долго ли Java переживала те же проблемы с датами, что и JavaScript? Ровно до 1997 года, когда они отказались от своего Date. А JavaScript всё это время тащит на себе этот груз - мутирующий объект Date, который создаёт кучу ошибок в боевом коде. Но вот наконец-то появился Temporal API, и это действительно революция в обработке дат и времени.</p>
<p dir="auto">Temporary уже в два браузера - Firefox 139 и Chrome 144. Safari работает над поддержкой. Главное чудо в том, что за этой реализацией стоит <strong>temporal_rs</strong> - общая Rust-библиотека, которая используется сразу в Boa, Kiesel и V8. Это значит, что вместо того чтобы каждый движок писал свою реализацию, они договорились и создали единый стандарт.</p>
<h2>Почему Temporal был так нужен</h2>
<p dir="auto">Дате в JavaScript - практически ровесник самому языку. За три десятилетия разработчики научились с ним работать, но эти знания добываются кровью. Основная проблема в том, что Date объект - это <strong>мутирующий объект</strong>, которым жонглируют все операции. Когда ты прибавляешь день или изменяешь время, старый объект меняется, а не создаётся новый. Это приводит к ошибкам, особенно когда код становится сложнее.</p>
<p dir="auto">Temporary решает это принципиально по-другому. Вместо одного универсального объекта, который пытается быть всем сразу, здесь есть <strong>специализированные типы</strong> для разных задач. Нужна только дата без времени? Возьми PlainDate. Нужна дата с временем в конкретном часовом поясе? ZonedDateTime ждёт тебя. Требуется работать с моментом в UTC? Instant - твой выбор. Каждый тип заточен под свой сценарий и не пытается быть чем-то большим.</p>
<p dir="auto">Все операции возвращают <strong>новые значения</strong> вместо того чтобы менять старые. Это кажется мелочью, но на практике это превращает работу с датами из минного поля в спокойный расчёт. Код становится понятнее, ошибок меньше, и логика проще отследить.</p>
<p dir="auto">Вот что предоставляет Temporal для работы:</p>
<ul>
<li>PlainDate - работа с датами без учёта времени и часовых поясов</li>
<li>PlainTime - время суток без привязки к конкретной дате</li>
<li>PlainDateTime - дата и время, но без часового пояса</li>
<li>ZonedDateTime - полная информация с часовым поясом</li>
<li>Instant - момент времени в UTC, универсальный стандарт</li>
<li>Duration - промежуток времени между событиями</li>
<li>Month - информация о месяце года</li>
<li>YearMonth - год и месяц без конкретного дня</li>
</ul>
<h2>Как temporal_rs объединил все движки</h2>
<p dir="auto">Когда несколько движков начинают поддерживать один стандарт, обычно случается хаос. Каждый пишет своё, результаты отличаются, начинаются споры. Но на этот раз разработчики поступили умнее. Вместо того чтобы каждому движку писать собственную реализацию на своём языке, они создали <strong>temporal_rs</strong> - библиотеку на Rust, которая содержит всю основную логику.</p>
<p dir="auto">Это очень смелый шаг, потому что V8 (основа Chrome) написан на C++, а некоторые другие движки вообще на совсем других языках. Но Rust позволил решить эту проблему через FFI (Foreign Function Interface) - технологию, которая позволяет коду на одном языке вызывать код на другом. Так V8 может использовать Rust-библиотеку, не переписывая её на C++. Это гениально просто.</p>
<p dir="auto">Прямо сейчас temporal_rs используют:</p>
<ul>
<li>Boa - JavaScript движок на Rust, где всё разговаривает на одном языке</li>
<li>Kiesel - ещё один двигатель, где Rust становится стандартом</li>
<li>V8 - монстр, который работает в Chrome и Node.js</li>
<li>Yavashark - движок, который тоже подключился к этой системе</li>
</ul>
<p dir="auto">Это означает, что когда тебе нужно написать код для работы с датами, ты можешь быть почти уверен, что он будет вести себя одинаково во всех браузерах. Больше не нужно ловить подвохи с разными интерпретациями стандарта.</p>
<h2>Практика: как это работает в коде</h2>
<p dir="auto">Давайте посмотрим, как реально использовать Temporal. Если ты работаешь с Rust и хочешь использовать temporal_rs напрямую, то сначала добавляешь зависимость:</p>
<pre><code class="language-rust">cargo add temporal_rs
</code></pre>
<p dir="auto">Или добавляешь в Cargo.toml:</p>
<pre><code class="language-rust">temporal_rs = "0.1.0"
</code></pre>
<p dir="auto">А потом пишешь какой-нибудь практический код:</p>
<pre><code class="language-rust">use std::convert::TryFrom;
use temporal_rs::{Calendar, Temporal, options::DifferenceSettings, partial::PartialDuration};

// Получаем сегодняшнюю дату
let today = Temporal::now().plain_date_iso(None).unwrap();

// Добавляем один день через Duration
let partial = PartialDuration::empty().with_days(1);
let tomorrow = today.add(&amp;partial.try_into().unwrap(), None).unwrap();

// Считаем разницу между датами
let diff = today.since(&amp;tomorrow, DifferenceSettings::default()).unwrap();
</code></pre>
<p dir="auto">Это выглядит просто, но за этой простотой стоит вся мощь Temporal. Обрати внимание на несколько ключевых моментов:</p>
<ul>
<li><strong>Новые объекты, а не мутация</strong>: когда ты вызываешь add(), ты получаешь новую дату, а старая остаётся неизменной</li>
<li><strong>Явная работа с часовыми поясами</strong>: функции, которые могут быть чувствительны к часовому поясу, требуют его указать явно</li>
<li><strong>Типизация</strong>: Rust проверит ошибки уже на этапе компиляции, а не во время выполнения</li>
<li><strong>Методы для вычислений</strong>: есть встроенные методы для сложения, вычитания, округления и сравнения</li>
</ul>
<p dir="auto">В JavaScript это выглядит чуть проще (когда Temporal станет стандартной частью языка):</p>
<pre><code class="language-javascript">// Получаем текущую дату
const today = Temporal.Now.plainDateISO();

// Прибавляем день
const tomorrow = today.add({ days: 1 });

// Проверяем разницу
const diff = today.until(tomorrow);
</code></pre>
<h2>Статус и дальнейшая дорога</h2>
<p dir="auto">Темпоральный API пока находится на <strong>Stage 3</strong> процесса TC39 - это значит, что он уже готов для реальной реализации в браузерах, но всё ещё может получить правки и улучшения на основе обратной связи. Следующий этап - это Stage 4, который добавит Temporal в официальный стандарт ECMAScript как полноценную часть языка.</p>
<p dir="auto">Планы TC39 амбициозны: на мартовском плнарном заседании (которое проходит в New York в Google) разработчики собираются предложить повышение Temporal на Stage 4. Если это произойдёт, то мы официально получим новый стандарт для работы с датами. Но даже если на этот раз не получится, Temporal уже работает в боевых браузерах, и разработчики могут начинать интегрировать его в свои проекты.</p>
<p dir="auto">Полифилл всё ещё может пригодиться для старых браузеров, но с Firefox и Chrome уже поддерживающими Temporal, покрытие браузерами становится солидным. Safari тоже работает над поддержкой - ранние версии уже видны в Safari Technical Preview.</p>
<p dir="auto">Вот что стоит учитывать при планировании использования:</p>
<ul>
<li>Chrome 144+ поддерживает Temporal из коробки</li>
<li>Firefox 139+ также имеет встроенную поддержку</li>
<li>Safari поддержка находится в разработке, но уже близко</li>
<li>Для старых браузеров нужен полифилл (доступен на npm)</li>
<li>Node.js будет поддерживать Temporal через обновления V8</li>
</ul>
<p dir="auto">Общая реализация через temporal_rs означает, что поведение будет предсказуемо везде. Нет больше странных различий между браузерами в вычислении дат.</p>
<h2>Технические детали сотрудничества движков</h2>
<p dir="auto">Что делает сотрудничество V8, Boa и Kiesel особенно интересным - это факт, что каждый из них написан на разных языках. V8 использует C++, Boa родился на Rust, Kiesel создан на Zig. Но всё это не помешало им договориться и использовать одну общую библиотеку.</p>
<p dir="auto">Это возможно благодаря FFI - инструменту, который позволяет интеграции между языками. temporal_rs экспортирует своё API таким образом, чтобы его мог использовать код на других языках. Когда V8 выполняет операцию с датой, он вызывает функции из temporal_rs, получает результат и возвращает его обратно в JavaScript код.</p>
<p dir="auto">Такой подход имеет <strong>огромные преимущества</strong>:</p>
<ul>
<li><strong>Единая реализация логики</strong> - баги ловятся один раз, а не несколько</li>
<li><strong>Меньше дублирования</strong> - каждый движок не пишет свою версию wheel</li>
<li><strong>Быстрая итерация</strong> - улучшения в temporal_rs автоматически попадают везде</li>
<li><strong>Проще тестирование</strong> - стандартный набор тестов работает для всех</li>
<li><strong>Экономия времени</strong> - разработчики могут сосредоточиться на оптимизации, а не переписывании</li>
</ul>
<p dir="auto">Это показывает новый тренд в разработке JavaScript - движки начинают сотрудничать вместо соперничества. То, что раньше казалось невозможным (общая реализация на Rust для C++ и других языков), теперь стало нормой.</p>
<h2>Что дальше для разработчиков</h2>
<p dir="auto">Темпоральный API - это не просто улучшение существующей функциональности, это <strong>переосмысление</strong> того, как мы работаем с датами. Разработчикам больше не нужно помнить про подводные камни Date, про то, что месяцы считаются с нуля, про часовые пояса как врага. Всё стало явным и безопасным.</p>
<p dir="auto">Общая реализация через temporal_rs означает, что разработчики могут верить коду, который они написали один раз. Нет больше ситуаций, когда дата считается по-разному в Chrome и Firefox. Это создаёт условия для более надежной и предсказуемой работы с датами во всей экосистеме JavaScript.</p>
]]></description><link>https://forum.exlends.ru/topic/1372/kiesel-na-rust-universalnaya-realizaciya-temporal-api</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:52:56 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1372.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Mar 2026 08:14:53 GMT</pubDate><ttl>60</ttl></channel></rss>