Temporal يصل إلى ES2026: نهاية معاناة التواريخ في جافاسكربت

في اجتماع TC39 خلال مارس 2026 وصلت واجهة Temporal إلى المرحلة الرابعة (Stage 4)، ودخلت رسميًا في مواصفة ECMAScript 2026. هذي نهاية رحلة بدأت من 2017 — قرابة عقد كامل من العمل — لإصلاح واحد من أقدم أوجاع اللغة: الكائن Date.

المشكلة: كائن Date عمره ما كان كافي

أي مطوّر تعامل مع التواريخ في جافاسكربت يعرف الألم. كائن Date قابل للتغيير (mutable)، ما يدعم المناطق الزمنية بشكل صحيح، وسلوكه مربك لدرجة أن الحل المعتاد كان تحميل مكتبة خارجية ثقيلة مثل Moment.js — وأحيانًا مئات الكيلوبايتات من بيانات المناطق الزمنية — عشان تسوّي عملية بسيطة مثل "أضف ساعتين مع مراعاة التوقيت الصيفي".

النتيجة المعروفة: إما أخطاء صامتة في حسابات الوقت، أو تجنّب Date كليًا.

وش تغيّر؟ فضاء أسماء Temporal

Temporal يقدّم فضاء أسماء جديد بأنواع متخصصة، وكل قيمة فيه ثابتة (immutable) — أي عملية ترجع قيمة جديدة بدل ما تعدّل الأصل. أهم الأنواع:

  • Temporal.Instant — لحظة زمنية دقيقة على خط الزمن العالمي.
  • Temporal.ZonedDateTime — تاريخ ووقت مربوطان بمنطقة زمنية محددة، مع تعامل صحيح مع التوقيت الصيفي.
  • Temporal.PlainDate و Temporal.PlainTime و Temporal.PlainDateTime — قيم تقويمية بدون منطقة زمنية (مثل "24 يوليو" مجردًا).
  • Temporal.Duration — مدة زمنية للحساب المباشر بدون مكتبات.
  • Temporal.Now — نقطة دخول صريحة للوقت الحالي.

مثال عملي

import { Temporal } from '@js-temporal/polyfill';
// حتى يصير الدعم الأصلي متوفرًا في كل مكان

// تاريخ مجرد بدون منطقة زمنية
const date = Temporal.PlainDate.from('2026-07-24');
date.add({ days: 10 }).toString();
// '2026-08-03' — القيمة ثابتة، فترجع نسخة جديدة

// لحظة دقيقة مربوطة بمنطقة زمنية
const meeting = Temporal.ZonedDateTime.from({
timeZone: 'Asia/Riyadh',
year: 2026, month: 7, day: 24, hour: 16, minute: 0,
});

// التحويل لمنطقة ثانية — التوقيت الصيفي محسوب صح
meeting.withTimeZone('Europe/Moscow').toString();

// حساب المدد بدون أي مكتبة خارجية
const dur = Temporal.Duration.from({ hours: 3, minutes: 30 });
meeting.add(dur).toString();

// "الآن" صار صريحًا ومربوطًا بالمنطقة
Temporal.Now.zonedDateTimeISO('Asia/Riyadh').toString();

لاحظ الفرق الجوهري: ما فيه تعديل خفي على القيم، والمنطقة الزمنية جزء أصيل من النوع مو إضافة على الجنب.

تنبيهات من أرض الواقع

Temporal دخل المواصفة، لكن الدعم لا يزال يتوسّع:

  • المتصفحات: Firefox شحن الدعم، والمتصفحات المبنية على Chromium (Chrome وEdge) تدعمه اعتبارًا من Chromium 144. أما Safari فالدعم جزئي في نسخة Technology Preview.
  • TypeScript: الإصدار 6.0 يتضمّن تعريفات الأنواع الخاصة بـ Temporal.
  • Node.js: الدعم متوقع في إصدار قادم، وحتى ذلك الحين استخدم الـ polyfill الرسمي @js-temporal/polyfill.

القاعدة العملية: للإنتاج اليوم، اعتمد على الـ polyfill الرسمي حتى يكتمل الدعم الأصلي عبر بيئات التشغيل المستهدفة، ثم أزِله لاحقًا بدون تغيير الكود.

الخلاصة

Temporal مو مجرد بديل لـ Date؛ هو إعادة تفكير كاملة في كيفية تعامل جافاسكربت مع الزمن: قيم ثابتة، مناطق زمنية من الجذر، وحساب مدد مدمج. الانتقال إليه يقلّل الأخطاء ويشيل اعتمادك على مكتبات ثقيلة. ابدأ بالـ polyfill في مشروع واحد، واكتب دوال الوقت الجديدة بـ Temporal مباشرة.

وإذا كنت تبني سلسلة أدواتك الحديثة، Temporal يكمل صورة أوسع من تطوّر النظام البيئي — مثل ما شفنا في TypeScript 7 والمترجم الأصلي.

المصدر الأساسي: مقترح Temporal — TC39 (GitHub)