Temporal: ۹ سال تلاش برای درست کردن تاریخ و زمان در جاوااسکریپت
خلاصهٔ کاملتر
اگه تا حالا با آبجکت Date در جاوااسکریپت کار کردی، احتمالاً با یه سری باگ و رفتار عجیب روبرو شدی که دردسرساز بودن. داستان Temporal، داستانِ یه تلاش ۹ سالهست برای اینکه این مشکل قدیمی رو یه بار برای همیشه حل کنن.
ماجرا برمیگرده به سال ۱۹۹۵. برندان آیش فقط ۱۰ روز وقت داشت تا جاوااسکریپت رو بسازه. تو اون شتاب، تصمیم گرفته شد که پیادهسازی Date رو مستقیماً از جاوا کپی کنن. اون موقع منطقی به نظر میرسید؛ جاوا داشت اوج میگرفت و جاوااسکریپت قراری بود «برادر کوچیکتر» باشه. فلسفه داخلی حتی یه اسم داشت: MILLJ یا «Make It Look Like Java». این تصمیم شتابزده، برای ۳ دهه گریبان توسعهدهندهها رو گرفت.
مشکل اول جهشپذیری (Mutability) بود. توسعهدهندهها ناخواسته آبجکت Date اصلی رو تغییر میدادن:
const date = new Date("2026-02-25T00:00:00Z");
function addOneDay(d) {
d.setDate(d.getDate() + 1); // اشتباه! این date اصلی رو تغییر میده
return d;
}
addOneDay(date);
console.log(date.toISOString()); // "2026-02-26T00:00:00.000Z"مشکل دوم، رفتار عجیب در حساب ماهها بود. مثلاً اگه یه روز فروردین ۳۱ام ماه رو داشتی و یه ماه بهش اضافه میکردی، به جای آخرین روز اردیبهشت، میرفتی به روز اول خرداد:
const billingDate = new Date("Sat Jan 31 2026");
billingDate.setMonth(billingDate.getMonth() + 1);
// انتظار: Feb 28 — واقعیت: Mar 02مشکل سوم هم پارسینگ مبهم بود. یه رشتهی «شبیه ISO 8601» میتونست بسته به مرورگر، بهعنوان UTC، local time، یا حتی یه خطا تفسیر بشه. این رفتار تعریفنشده در spec بود و هر مرورگر کار خودش رو میکرد.
وقتی وب بزرگ شد و جاوااسکریپت وارد سیستمهای بانکی، پلتفرمهای معاملاتی و ابزارهای پیچیده شد، این مشکلات دیگه قابلچشمپوشی نبودن. اکوسیستم مجبور شد با کتابخونههایی مثل Moment.js جواب بده که سال ۲۰۱۱ منتشر شد. ولی Moment هم مشکل خودش رو داشت: حجم زیاد بسته، عدمامکان tree-shaking، و دادههای locale و time zone که باید همهشون ship میشدن. امروز کتابخونههای datetime روی هم بیش از ۱۰۰ میلیون دانلود در هفته دارن — که نشونهی یه خلأ واقعیه.
در سال ۲۰۱۷، Maggie Johnson-Pint (از نگهدارندههای اصلی Moment.js) تصمیم گرفت پروپوزال Temporal رو به TC39 ببره. پروپوزال با استقبال گرم مواجه شد و به Stage 1 رسید. هدف Temporal اینه که:
- جایگزین کامل Date بشه
- انواع مختلف DateTime (نه فقط یه API) ارائه بده
- ایمیوتبل باشه
- پشتیبانی اولدرجه از time zone و تقویمهای مختلف داشته باشه
شرکت Bloomberg هم یکی از حامیان اصلی این پروپوزال بوده. بلومبرگ جاوااسکریپت رو در مقیاس بزرگ روی ترمینال مالیاش اجرا میکنه و کاربراش در هر منطقه زمانیای هستن. اونها به timestampهای دقیق با precision نانوثانیه نیاز دارن، باید با آپدیتهای IANA Time Zone Database کنار بیان، و باید time zone کاربر رو مستقل از time zone ماشین تنظیم کنن — چیزهایی که Date اصلاً برای اونها طراحی نشده بود.
بعد از سالها کار مداوم، جمعآوری نیازمندیها، طراحی API، و همکاری با موتورهای مرورگر مثل V8 و SpiderMonkey، Temporal الان در مراحل پایانی استانداردسازی قرار داره و بهزودی بهصورت بومی در جاوااسکریپت در دسترس خواهد بود.
نکات کلیدی:
- آبجکت Date جاوااسکریپت در ۱۰ روز از روی جاوا کپی شد و هنوز همون مشکلات اولیه رو داره
- مشکلات اصلی: جهشپذیری ناخواسته، overflow خاموش در ماهها، و پارسینگ مبهم
- کتابخونههایی مثل Moment.js مشکل رو پچ کردن ولی حجم بسته رو زیاد کردن
- پروپوزال Temporal از ۲۰۱۷ شروع شد تا یه راهحل بومی، ایمیوتبل و قدرتمند بسازه
- بلومبرگ یکی از حامیان اصلی Temporal بوده چون نیازهای واقعی مالی داشته که Date نمیتونست پاسخگو باشه
- Temporal چند نوع DateTime مجزا داره، time zone و تقویمهای مختلف رو پشتیبانی میکنه و ایمیوتبله




