مقدمة: لماذا التعامل مع التواريخ في JavaScript يمثل تحديًا للمطور
\nالتعامل مع التواريخ والوقت هو من أكثر المهام شيوعًا وفي نفس الوقت خادعة في تطوير الويب. قد يبدو الأمر بسيطًا، مثل الحصول على التاريخ الحالي أو حساب الفرق بين حدثين؟ لكن في الممارسة العملية، يواجه المطورون في JavaScript (Node.js) العديد من المزالق: المناطق الزمنية، تنسيق ISO، السلوك غير البديهي لطريقة getMonth() والمكتبات القديمة. في هذه المقالة، سنقوم بتحليل التعامل مع التواريخ من المبادئ الأساسية إلى التقنيات المتقدمة، باستخدام كائن Date القياسي فقط والمكتبة الحديثة date-fns.
1. أساسيات كائن Date في Node.js
\nالكائن المدمج Date هو الأساس للتعامل مع الوقت. فهو يخزن عدد الميلي ثانية المنقضية منذ 1 يناير 1970 (عصر Unix). دعنا نستعرض العمليات الأساسية.
إنشاء والحصول على الوقت الحالي
\nأبسط طريقة لإنشاء كائن تاريخ هي استدعاء new Date() بدون وسائط. سيعيد هذا التاريخ والوقت الحاليين على الخادم.
// التاريخ والوقت الحاليان (في المنطقة الزمنية للخادم)\nconst now = new Date();\nconsole.log(now); // مثال: 2024-05-20T14:30:00.000Z\n\n// الإنشاء من سلسلة ISO\nconst specificDate = new Date('2024-12-25T10:00:00');\nconsole.log(specificDate); // 2024-12-25T10:00:00.000Z\n\n// الإنشاء من المكونات (السنة، الشهر، اليوم، الساعات، الدقائق، الثواني)\nconst birthday = new Date(1990, 5, 15); // انتبه: الشهر 5 = يونيو!\nconsole.log(birthday); // 1990-06-15T00:00:00.000Z\nملاحظة مهمة: ترقيم الأشهر في JavaScript يبدأ من 0 (يناير = 0، ديسمبر = 11). هذا سبب شائع للأخطاء.
\n\nطرق الحصول على مكونات التاريخ
\nلاستخراج الأجزاء الفردية من التاريخ، تُستخدم دوال الجلب (getters). تذكر أنها تعيد القيم في المنطقة الزمنية المحلية للخادم.
\nconst date = new Date('2024-03-15T12:30:45');\n\nconsole.log(date.getFullYear()); // 2024\nconsole.log(date.getMonth()); // 2 (مارس، لأن العد يبدأ من 0)\nconsole.log(date.getDate()); // 15\nconsole.log(date.getDay()); // 5 (الجمعة، 0 = الأحد)\nconsole.log(date.getHours()); // 12\nconsole.log(date.getMinutes()); // 30\nconsole.log(date.getSeconds()); // 45\nللعمل بالتوقيت العالمي المنسق (UTC)، استخدم الطرق ذات البادئة getUTC...، مثل getUTCHours().
2. تنسيق وإخراج التواريخ
\nفي Node.js، لا يوجد تنسيق مدمج مناسب للتواريخ إلى تنسيق نصي عشوائي (مثل "15 مارس 2024"). هناك طريقتان لذلك: تجميع النص يدويًا أو استخدام المكتبات.
\n\nالتنسيق اليدوي (بدون مكتبات خارجية)
\nإذا كنت بحاجة إلى إخراج التاريخ بتنسيق بسيط، يمكنك كتابة دالة صغيرة.
\nfunction formatDate(date) {\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n return `${day}.${month}.${year}`;\n}\n\nconst today = new Date();\nconsole.log(formatDate(today)); // مثال: "20.05.2024"\n\nالحل الحديث: مكتبة date-fns
\nمكتبة date-fns هي بديل حديث، معياري، وخفيف الوزن للمكتبة القديمة moment.js. إنها مثالية لـ Node.js.
// التثبيت: npm install date-fns\n\nconst { format, addDays, differenceInDays } = require('date-fns');\nconst { ar } = require('date-fns/locale'); // الترجمة\n\nconst date = new Date();\n\n// التنسيق مع الترجمة\nconsole.log(format(date, 'dd MMMM yyyy', { locale: ar }));\n// مثال: "20 مايو 2024"\n\n// إضافة أيام\nconst nextWeek = addDays(date, 7);\nconsole.log(format(nextWeek, 'yyyy-MM-dd')); // "2024-05-27"\n\n// الفرق بالأيام\nconst start = new Date(2024, 0, 1);\nconst end = new Date(2024, 11, 31);\nco