العمل مع التواريخ في JavaScript (Node.js): نظرة عامة على المكتبات الشائعة
العمل مع التواريخ والوقت هو أحد المهام المتكررة في تطوير الويب. الكائن المدمج Date في JavaScript لديه وظائف محدودة وواجهة برمجة تطبيقات غير مريحة. لحسن الحظ، يوجد العديد من المكتبات لـ Node.js التي تبسط تحليل وتنسيق ومعالجة ومقارنة التواريخ. في هذه المقالة، سنستعرض أربع مكتبات الأكثر شيوعًا: Moment.js، Day.js، date-fns و Luxon.
1. Moment.js (أسطورية ولكنها قديمة)
Moment.js كانت لفترة طويلة المعيار الفعلي للعمل مع التواريخ. توفر واجهة برمجة تطبيقات غنية للتحليل والتحقق والمعالجة والتنسيق. ومع ذلك، تم الاعتراف رسميًا بأن المشروع قديم (legacy) - يوصي المطورون باستخدام البدائل الحديثة. العيوب الرئيسية: حجم كبير (~300 KB)، طرق متغيرة (تغير الكائن الأصلي)، ومشاكل مع Tree Shaking.
// التثبيت: npm install momentconst moment = require('moment');
// التحليل والتنسيقconst now = moment();console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2024-01-15 14:30:00
// المعالجةconst future = moment().add(7, 'days').startOf('week');console.log(future.format('dddd, MMMM Do YYYY')); // Monday, January 22nd 2024
// الفرق بين التواريخconst a = moment('2024-01-01');const b = moment('2024-01-10');console.log(b.diff(a, 'days')); // 92. Day.js (الخليفة خفيف الوزن)
Day.js هي مكتبة حديثة بنفس واجهة برمجة التطبيقات مثل Moment.js، ولكن بحجم 2 كيلوبايت فقط. إنها غير قابلة للتغيير تمامًا (لا تغير الكائنات الأصلية)، وتدعم الإضافات، وتعمل بشكل ممتاز مع Tree Shaking. مثالية للمشاريع التي يكون فيها حجم الحزمة مهمًا.
// التثبيت: npm install dayjsconst dayjs = require('dayjs');const relativeTime = require('dayjs/plugin/relativeTime');dayjs.extend(relativeTime);
const now = dayjs();console.log(now.format('DD.MM.YYYY')); // 15.01.2024
// العمل مع المناطق الزمنية (يتطلب إضافة utc)const utc = require('dayjs/plugin/utc');dayjs.extend(utc);const date = dayjs.utc('2024-01-15T12:00:00Z').local();console.log(date.format('HH:mm')); // 15:00 (يعتمد على المنطقة الزمنية)
// الوقت النسبيconsole.log(dayjs('2023-12-25').fromNow()); // 3 weeks ago3. date-fns (النهج الوظيفي)
date-fns هي مكتبة مبنية على مبادئ البرمجة الوظيفية. بدلاً من كائن واحد، توفر العديد من الدوال النقية. يتم استيراد كل دالة على حدة، مما يسمح بتجميع الكود المطلوب فقط. هذه هي المكتبة الأكثر أداءً ونمطية من بين تلك المذكورة.
// التثبيت: npm install date-fnsconst { format, addDays, differenceInDays, startOfWeek } = require('date-fns');const { ru } = require('date-fns/locale');
const now = new Date();
// التنسيق مع التوطينconsole.log(format(now, 'PPPP', { locale: ru })); // понедельник, 15 января 2024 г.
// المعالجة (دوال نقية)const nextWeek = addDays(now, 7);console.log(format(nextWeek, 'yyyy-MM-dd')); // 2024-01-22
// الفرقconst start = new Date(2024, 0, 1);console.log(differenceInDays(now, start)); // 14
// بداية الأسبوعconst monday = startOfWeek(now, { weekStartsOn: 1 });console.log(format(monday, 'dd.MM.yyyy')); // 15.01.20244. Luxon (المعيار الحديث من مبتكري Moment.js)
Luxon هي مكتبة من نفس مطوري Moment.js، ولكنها خالية من عيوبها. تستخدم الكائنات الأصلية DateTime و Duration و Interval، وهي غير قابلة للتغيير تمامًا، وتدعم المناطق الزمنية والتدويل "خارج الصندوق". موصى بها للمشاريع الجديدة.
// التثبيت: npm install luxonconst { DateTime, Duration, Inte