مقدمة
\nالعمل مع التواريخ والوقت هو أحد أكثر المهام شيوعًا، ولكنها أيضًا من أكثرها صعوبة في تطوير الويب. الكائن القياسي Date في JavaScript، على الرغم من تعدد استخداماته، لديه عدد من القيود: عدم وجود دعم مدمج للمناطق الزمنية (باستثناء UTC والوقت المحلي)، وطرق غير ملائمة للتنسيق، وصعوبات في حساب الفرق بين التواريخ. في هذه المقالة، سنستعرض التقنيات المتقدمة للعمل مع التواريخ في بيئة Node.js، والتي ستساعدك على كتابة كود موثوق وواضح.
1. Intl.DateTimeFormat: تنسيق قوي بدون مكتبات خارجية
\nيوفر JavaScript الحديث واجهة برمجة تطبيقات مدمجة Intl.DateTimeFormat، والتي تتيح تنسيق التواريخ والوقت بمرونة مع مراعاة الإعدادات المحلية. هذه أداة مثالية إذا كنت لا تحتاج إلى كل قوة المكتبات الخارجية.
الاستخدام الأساسي
\nقم بإنشاء مثيل للمنسق، مع تمرير الإعدادات المحلية وكائنًا بالخيارات:
\nconst date = new Date('2024-12-25T10:30:00Z');\n\n// تنسيق للإعدادات المحلية الروسية\nconst ruFormatter = new Intl.DateTimeFormat('ru-RU', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n weekday: 'long',\n hour: '2-digit',\n minute: '2-digit',\n timeZone: 'Europe/Moscow'\n});\n\nconsole.log(ruFormatter.format(date));\n// الإخراج: "среда, 25 декабря 2024 г. в 13:30"\n\nالعمل مع المناطق الزمنية
\nالميزة الرئيسية لـ Intl.DateTimeFormat هي دعم المناطق الزمنية من خلال خيار timeZone. يمكنك عرض نفس التاريخ في مناطق زمنية مختلفة:
const date = new Date();\n\nconst formatters = {\n 'نيويورك': new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }),\n 'طوكيو': new Intl.DateTimeFormat('ja-JP', { timeZone: 'Asia/Tokyo', dateStyle: 'full', timeStyle: 'long' }),\n 'لندن': new Intl.DateTimeFormat('en-GB', { timeZone: 'Europe/London', dateStyle: 'full', timeStyle: 'long' })\n};\n\nfor (const [city, fmt] of Object.entries(formatters)) {\n console.log(`${city}: ${fmt.format(date)}`);\n}\n\nتنسيق نطاقات التواريخ
\nيمكن لواجهة API أيضًا تنسيق النطاقات باستخدام طريقة formatRange:
const start = new Date('2024-01-01');\nconst end = new Date('2024-01-05');\n\nconst rangeFormatter = new Intl.DateTimeFormat('ru-RU', {\n month: 'long',\n day: 'numeric'\n});\n\nconsole.log(rangeFormatter.formatRange(start, end));\n// الإخراج: "1–5 января"\n\n2. معالجة التواريخ: الإضافة والطرح والفرق
\nالكائن القياسي Date غير مناسب تمامًا للعمليات الحسابية. دعنا ننظر في طريقتين: JavaScript الخالص والمكتبات الشائعة.
JavaScript الخالص: العمل مع الميلي ثانية
\nأبسط طريقة هي تحويل التاريخ إلى Unix timestamp (ميلي ثانية من 1 يناير 1970) وإجراء العمليات:
\nfunction addDays(date, days) {\n const result = new Date(date);\n result.setTime(result.getTime() + days * 24 * 60 * 60 * 1000);\n return result;\n}\n\nfunction diffDays(date1, date2) {\n const msDiff = Math.abs(date2.getTime() - date1.getTime());\n return Math.floor(msDiff / (1000 * 60 * 60 * 24));\n}\n\nconst today = new Date('2024-10-01');\nconst future = addDays(today, 30);\nconsole.log(future); // 2024-10-31\nconsole.log(diffDays(today, future)); // 30\nالعيب: لا يراعي التوقيت الصيفي، والثواني الكبيسة، واختلاف أطوال الأشهر.
\n\nمكتبة date-fns: نهج وظيفي وخفيف
\ndate-fns هي مكتبة معيارية، حيث كل دالة هي وحدة منفصلة. هذا يسمح بعدم تضخيم الحزمة:
// التثبيت: npm install date-fns\nconst { addDays, subMonths, differenceInDays, format } = require('date-fns');\nconst { ru } = require('date-fns/locale');\n\nconst startDate = new Date(2024, 0, 15); // 15 يناير 2024\n\nconst plusWeek = addDays(startDa