العمل مع التواريخ والوقت في JavaScript (Node.js): من الأساسيات إلى التقنيات المتقدمة
العمل مع التواريخ والوقت هو أحد أكثر المهام شيوعًا في تطوير backend. سواء كان تسجيل الأحداث، أو حساب المواعيد النهائية، أو إنشاء التقارير، أو العمل مع API، فإن القدرة على معالجة الطوابع الزمنية بشكل صحيح هي مهارة بالغة الأهمية. في هذه المقالة، سنستعرض جميع الجوانب الرئيسية للعمل مع التواريخ في بيئة Node.js: من الكائن المدمج Date إلى المكتبات الشائعة التي تسهل حياة المطور.
1. الكائن المدمج Date: الأساسيات والمزالق
في JavaScript، يتولى الكائن المدمج Date مسؤولية العمل مع التواريخ. يوفر طرقًا أساسية لإنشاء التواريخ وقراءتها ومعالجتها. ومع ذلك، لديه عدد من الخصائص التي من المهم معرفتها.
إنشاء كائن Date
أبسط طريقة للحصول على التاريخ والوقت الحاليين:
const now = new Date();console.log(now); // 2025-03-20T14:30:00.000Z (مثال)يمكن إنشاء تاريخ من سلسلة نصية، أو timestamp (مللي ثانية منذ 1 يناير 1970)، أو عن طريق تحديد المكونات يدويًا:
// من سلسلة نصية (ISO 8601)const dateFromString = new Date("2025-12-25T10:00:00Z");
// من timestampconst dateFromTimestamp = new Date(1735048800000);
// من المكونات (السنة، الشهر (0-11)، اليوم، الساعة، الدقيقة، الثانية، المللي ثانية)const dateFromParts = new Date(2025, 11, 25, 10, 0, 0, 0); // 25 ديسمبر 2025 10:00:00console.log(dateFromParts); // 2025-12-25T07:00:00.000Z (يعتمد على المنطقة الزمنية)هام: يتم ترقيم الأشهر في JavaScript بدءًا من 0 (يناير هو 0، ديسمبر هو 11). هذا سبب شائع للأخطاء.
الحصول على مكونات التاريخ
يوفر كائن Date طرقًا للحصول على المكونات الفردية:
const date = new Date();console.log(date.getFullYear()); // 2025console.log(date.getMonth()); // 2 (مارس، لأن العد يبدأ من 0)console.log(date.getDate()); // 20console.log(date.getDay()); // 4 (الخميس، 0 - الأحد)console.log(date.getHours()); // 17console.log(date.getMinutes()); // 45console.log(date.getSeconds()); // 12console.log(date.getMilliseconds());// 345console.log(date.getTime()); // 1742474712345 (timestamp)لاحظ: كل هذه الطرق تُرجع القيم في المنطقة الزمنية المحلية للخادم. للعمل مع UTC، استخدم الطرق ذات البادئة getUTC... (مثل getUTCFullYear()).
التلاعب بالتواريخ
يتم تغيير التاريخ من خلال طرق set. هذه الطرق تغير الكائن الأصلي:
const date = new Date();date.setFullYear(2026);date.setMonth(0); // ينايرdate.setDate(15);console.log(date); // 2026-01-15T... (يتم الاحتفاظ ببقية المكونات)مزلق: طرق set تقوم تلقائيًا بتصحيح التاريخ. على سبيل المثال، إذا قمت بتعيين 32 يناير، سيصبح التاريخ 1 فبراير. قد يكون هذا مناسبًا أو غير متوقع.
2. تنسيق التواريخ وعرضها بالشكل المطلوب
الطريقة المدمجة toLocaleDateString() تسمح بعرض التاريخ بالتنسيق المستخدم في لغة معينة:
const date = new Date(2025, 11, 25);console.log(date.toLocaleDateString('ru-RU')); // 25.12.2025console.log(date.toLocaleDateString('en-US')); // 12/25/2025console.log(date.toLocaleDateString('de-DE')); // 25.12.2025لتنسيق أكثر مرونة، يمكن استخدام Intl.DateTimeFormat:
const formatter = new Intl.DateTimeFormat('ru-RU', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'});console.log(formatter.format(new Date())); // "четверг, 20 марта 2025 г., 17:45"ومع ذلك، بالنسبة للتنسيقات المعقدة (مثل "2025-03-20T14:30:00+03:00") أو القوالب المخصصة، من الأفضل استخدام المكتبات (سيتم ذكرها لاحقًا).