العمل مع التواريخ والوقت في JavaScript: المستوى المتقدم

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة

\n

العمل مع التواريخ والوقت هو أحد أكثر المهام شيوعًا، ولكنها أيضًا من أكثرها صعوبة في تطوير الويب. الكائن القياسي Date في JavaScript، على الرغم من تعدد استخداماته، لديه عدد من القيود: عدم وجود دعم مدمج للمناطق الزمنية (باستثناء UTC والوقت المحلي)، وطرق غير ملائمة للتنسيق، وصعوبات في حساب الفرق بين التواريخ. في هذه المقالة، سنستعرض التقنيات المتقدمة للعمل مع التواريخ في بيئة Node.js، والتي ستساعدك على كتابة كود موثوق وواضح.

\n\n

1. Intl.DateTimeFormat: تنسيق قوي بدون مكتبات خارجية

\n

يوفر JavaScript الحديث واجهة برمجة تطبيقات مدمجة Intl.DateTimeFormat، والتي تتيح تنسيق التواريخ والوقت بمرونة مع مراعاة الإعدادات المحلية. هذه أداة مثالية إذا كنت لا تحتاج إلى كل قوة المكتبات الخارجية.

\n\n

الاستخدام الأساسي

\n

قم بإنشاء مثيل للمنسق، مع تمرير الإعدادات المحلية وكائنًا بالخيارات:

\n
const 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. يمكنك عرض نفس التاريخ في مناطق زمنية مختلفة:

\n
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:

\n
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\n

2. معالجة التواريخ: الإضافة والطرح والفرق

\n

الكائن القياسي Date غير مناسب تمامًا للعمليات الحسابية. دعنا ننظر في طريقتين: JavaScript الخالص والمكتبات الشائعة.

\n\n

JavaScript الخالص: العمل مع الميلي ثانية

\n

أبسط طريقة هي تحويل التاريخ إلى Unix timestamp (ميلي ثانية من 1 يناير 1970) وإجراء العمليات:

\n
function 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: نهج وظيفي وخفيف

\n

date-fns هي مكتبة معيارية، حيث كل دالة هي وحدة منفصلة. هذا يسمح بعدم تضخيم الحزمة:

\n
// التثبيت: 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                

المدونات

توصيات الكتب