العمل مع التواريخ في TypeScript: نظرة عامة على المكتبات الشائعة
يعد العمل مع التواريخ والوقت من أكثر المهام شيوعًا وفي نفس الوقت غير التافهة في تطوير الويب. كائن Date المدمج في JavaScript (و TypeScript) له عدد من العيوب: قابلية التغيير، واجهة برمجة تطبيقات غير بديهية، مشاكل مع المناطق الزمنية، وعدم وجود طرق تنسيق مريحة. لحسن الحظ، يقدم نظام TypeScript البيئي العديد من المكتبات القوية التي تحل هذه المشكلات وتوفر دعمًا ممتازًا للأنواع.
في هذه المقالة، سننظر في ثلاث من أشهر المكتبات: date-fns وLuxon وDay.js. ستتعرف على ميزاتها ومزاياها وعيوبها وسترى أمثلة على استخدامها مع TypeScript.
1. date-fns — معيارية ووظيفية
date-fns هي مكتبة مبنية على مبادئ البرمجة الوظيفية. كل دالة هي وحدة منفصلة، مما يسمح باستيراد ما تحتاجه فقط ويقلل بشكل كبير من حجم الحزمة. في TypeScript، تحتوي المكتبة على أنواع مدمجة.
التثبيت
npm install date-fnsأمثلة على الاستخدام مع TypeScript
import { format, addDays, differenceInDays, isAfter, parseISO } from 'date-fns';
// تنسيق التاريخconst today = new Date();console.log(format(today, 'yyyy-MM-dd')); // '2025-03-20'
// إضافة أيامconst nextWeek = addDays(today, 7);console.log(format(nextWeek, 'dd.MM.yyyy')); // '27.03.2025'
// الفرق بين التواريخconst startDate = parseISO('2025-01-01');const endDate = parseISO('2025-12-31');const daysBetween = differenceInDays(endDate, startDate);console.log(`عدد الأيام في عام 2025: ${daysBetween}`); // 364
// مقارنة التواريخconst isFuture = isAfter(parseISO('2025-06-01'), today);console.log(`هل 1 يونيو 2025 في المستقبل؟ ${isFuture}`); // trueالمزايا
- هز الشجرة (tree-shaking) — تستورد فقط الدوال التي تحتاجها، مما يقلل من حجم التطبيق.
- عدم القابلية للتغيير — الدوال لا تعدل الكائنات الأصلية، بل تعيد كائنات جديدة.
- دعم TypeScript — كتابة كاملة للأنواع خارج الصندوق.
- التدويل — دعم العديد من اللغات، بما في ذلك العربية.
العيوب
- تعمل مع
Dateالأصلي، مما قد يكون غير مريح في العمليات المعقدة مع المناطق الزمنية. - لا يوجد دعم مدمج للكائنات غير القابلة للتغيير (كما في Luxon).
2. Luxon — قوي وحديث
Luxon هي مكتبة من أحد مؤلفي Moment.js، ولكن بدون عيوبها. تستخدم كائناتها الخاصة غير القابلة للتغيير DateTime وDuration وInterval، مما يجعل العمل مع التواريخ بديهيًا وآمنًا. تتمتع Luxon بدعم ممتاز للمناطق الزمنية والإعدادات المحلية.
التثبيت
npm install luxonقد يكون من الضروري تثبيت الأنواع لـ TypeScript:
npm install --save-dev @types/luxonأمثلة على الاستخدام مع TypeScript
import { DateTime, Duration } from 'luxon';
// الإنشاء والتنسيقconst now = DateTime.now();console.log(now.toFormat('yyyy-MM-dd HH:mm:ss')); // '2025-03-20 14:30:00'
// العمل مع المناطق الزمنيةconst moscowTime = DateTime.now().setZone('Europe/Moscow');console.log(`توقيت موسكو: ${moscowTime.toFormat('HH:mm')}`);
// إضافة فترةconst nextMonth = now.plus({ months: 1 });console.log(`بعد شهر: ${nextMonth.toFormat('dd.MM.yyyy')}`);
// الفرق بين التواريخconst start = DateTime.fromISO('2025-01-01');const end = DateTime.fromISO('2025-12-31');const diff = end.diff(start, ['months', 'days']);console.log(`الفرق: ${diff.months} شهر و ${diff.days} يوم`);
// العمل مع المددconst duration = Duration.from