وداعاً لـ Moment.js و Day.js: مستقبل التعامل مع التواريخ باستخدام Temporal API
لو كنت مبرمج JavaScript بقالك فترة، أكيد مريت بلحظة "الخناقة" مع كائن التاريخ الافتراضي Date object. كلنا عارفين الوجع ده؛ لما تحاول تعمل عملية حسابية بسيطة على التاريخ أو تتعامل مع المناطق الزمنية (Timezones) وتلاقي الكود اتحول لكابوس من السطور اللي مش مفهومة. عشان كدة، كنا بنلجأ لمكتبات خارجية زي Moment.js أو Day.js. النهاردة، هنتكلم عن الحل السحري اللي جاي ينهي عصر المكتبات دي: الـ Temporal API.
Table of contents [Show]
ليه أصلاً كنا بنستخدم مكتبات خارجية؟
كائن الـ Date في جافا سكريبت من ساعة ما اتولد وهو فيه مشاكل كتير. التعامل مع التوقيت العالمي (UTC) مقابل التوقيت المحلي، صعوبة حساب الفرق بين تاريخين، وعدم دعم المناطق الزمنية بشكل أصيل (Native) كان بيخلي الكود هش جداً وعرضة للبق (Bugs). مكتبات زي Moment.js كانت بتقدم حلول سهلة، بس كان ليها ضريبة: حجم ملفات كبير (Bundle size) ومشاكل في الأداء.
إيه هو الـ Temporal API؟
الـ Temporal API هو إضافة جديدة وقوية للغة JavaScript بتوفر نظام كامل ومنظم للتعامل مع التواريخ والأوقات. هي بتعالج كل العيوب اللي كانت موجودة في الـ Date، وبتخلي التعامل مع التاريخ والوقت جزء أصيل من المتصفح (Native) ومن غير ما تحتاج تحمل أي مكتبة خارجية.
أهم مفاهيم Temporal API
الـ Temporal مش مجرد كائن واحد، ده مجموعة كائنات متخصصة:
- Temporal.PlainDate: للتعامل مع التاريخ بس (سنة، شهر، يوم) من غير وقت.
- Temporal.PlainTime: للتعامل مع الوقت بس من غير تاريخ.
- Temporal.ZonedDateTime: وده "الوحش" اللي بيتعامل مع التواريخ والمناطق الزمنية بدقة متناهية.
- Temporal.Duration: عشان تحسب الفرق بين فترتين زمنيتين بشكل سهل.
أمثلة عملية
شوف الفرق في السهولة لما نحب نحصل على التاريخ الحالي أو نجمع عليه أيام:
// الحصول على التاريخ والوقت الحالي
const now = Temporal.Now.plainDateTimeISO();
console.log(now.toString());
// إضافة 3 أيام لتاريخ معين
const nextWeek = now.add({ days: 3 });
console.log(nextWeek.toString());
أو لما نحب نحسب الفرق بين تاريخين، الموضوع بقى بديهي جداً:
const start = Temporal.PlainDate.from('2023-01-01');
const end = Temporal.PlainDate.from('2023-01-15');
const duration = start.until(end);
console.log(duration.days); // النتيجة هتكون 14 يوم
المميزات اللي هتخليك تغير رأيك
أول حاجة، الـ Immutable (غير قابل للتعديل)، يعني لما بتعمل أي عملية على التاريخ، هو بينشئ نسخة جديدة بدل ما يعدل في التاريخ الأصلي، وده بيقلل الـ Side effects بشكل كبير. تاني حاجة، دعم المناطق الزمنية (Timezone support) بقى سهل جداً وبدون أخطاء، وده بيخلي تطبيقك يشتغل في أي بلد بنفس الكفاءة.
نصيحة من أخ لمبرمج
عزيزي المبرمج، الـ Temporal API لسه بيتحسن وبياخد مكانه في الـ Browsers. نصيحتي ليك إنك تبدأ تجرب الـ API ده في مشاريعك الجانبية (Side Projects) وتتعود عليه من دلوقتي. مش لازم تقلب كود قديم كله فوراً، بس خليك جاهز لأن ده المستقبل. تطوير مهاراتك في استخدام الـ Native APIs بيخليك مبرمج "شاطر" وبيقلل اعتمادك على الـ Dependencies اللي ممكن تتغير أو يتوقف دعمها في أي وقت. اقرأ التوثيق الرسمي، جرب بنفسك، وخليك دايماً سابق بخطوة.