كيفية تنسيق التاريخ في JavaScript: دليل الأداء

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

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

ابدأ الدورة

تنسيق التاريخ في JavaScript: ليس مجرد "ربط السلاسل النصية"

\n\n

سؤال "How do I format a date in JavaScript?" هو أحد أكثر الأسئلة شيوعًا على Stack Overflow. وليس من دون سبب. كل مطور واجه مرة واحدة على الأقل موقفًا يحتاج فيه إلى عرض التاريخ ليس بالتنسيق القياسي "Fri Feb 14 2025 12:00:00 GMT+0300"، ولكن بشكل جميل: "14 فبراير 2025" أو "2025-02-14". قد يبدو الأمر بسيطًا؟ لكن هناك الكثير من المزالق ومشاكل الأداء هنا.

\n\n

في هذه المقالة، سنستعرض جميع طرق تنسيق التواريخ في JavaScript: من أبسطها إلى الأكثر كفاءة في الأداء. ستتعلم كيفية تجنب الأخطاء النموذجية وجعل الكود ليس فقط جميلًا، ولكن أيضًا سريعًا. هيا بنا!

\n\n

لماذا الكائن Date الأصلي غير مريح إلى هذا الحد؟

\n\n

الكائن المدمج Date في JavaScript هو، بعبارة ملطفة، "إرث الماضي". فهو لا يوفر طريقة مدمجة format() كما في Python أو PHP. بدلاً من ذلك، عليك تجميع التاريخ يدويًا باستخدام الدوال الجالبة (getters):

\n\n
const date = new Date();\nconst day = String(date.getDate()).padStart(2, '0');\nconst month = String(date.getMonth() + 1).padStart(2, '0');\nconst year = date.getFullYear();\nconsole.log(`${year}-${month}-${day}`); // "2025-02-14"
\n\n

هذا يعمل، لكنه يبدو ضخمًا. وإذا كنت بحاجة أيضًا إلى توطين التاريخ (مثلًا إلى اللغة العربية)، فإن الكود يتضخم إلى أحجام غير لائقة. ولهذا السبب يبحث المطورون عن بدائل.

\n\n

طريقة toLocaleDateString: بسيطة وسريعة

\n\n

أسهل طريقة لتنسيق التاريخ في JavaScript هي استخدام طريقة toLocaleDateString(). فهي تقبل الإعدادات المحلية (locale) وكائنًا بالخيارات:

\n\n
const date = new Date();\nconst options = { year: 'numeric', month: 'long', day: 'numeric' };\nconsole.log(date.toLocaleDateString('ar-SA', options)); // "١٤ فبراير ٢٠٢٥"
\n\n

هذه الطريقة تتكيف تلقائيًا مع الإعدادات المحلية. هل تريد "February 14, 2025"؟ فقط قم بتغيير الإعدادات المحلية إلى 'en-US'.

\n\n

المزايا:

\n
    \n
  • سهولة الاستخدام.
  • \n
  • توطين مدمج.
  • \n
  • الكود يُقرأ كلغة طبيعية.
  • \n
\n\n

العيوب:

\n
    \n
  • الأداء: كل استدعاء لـ toLocaleDateString() ينشئ كائن تنسيق جديد. في حلقة من 1000 عنصر، قد يكون هذا ملحوظًا.
  • \n
  • تحكم محدود في التنسيق (لا يمكن، على سبيل المثال، عرض "14.02.2025" بدون السنة).
  • \n
\n\n

Intl.DateTimeFormat: قوي وفعال

\n\n

للحصول على تحكم أكثر دقة وتحسين، استخدم Intl.DateTimeFormat. هذا كائن يمكن إنشاؤه مرة واحدة واستخدامه بشكل متكرر:

\n\n
const formatter = new Intl.DateTimeFormat('ar-SA', {\n  year: 'numeric',\n  month: '2-digit',\n  day: '2-digit'\n});\n\nconst date1 = new Date();\nconst date2 = new Date('2024-12-25');\nconsole.log(formatter.format(date1)); // "١٤‏/٠٢‏/٢٠٢٥"\nconsole.log(formatter.format(date2)); // "٢٥‏/١٢‏/٢٠٢٤"
\n\n

لماذا هذا أسرع؟ لأنه يتم إنشاء كائن التنسيق مرة واحدة، وليس في كل استدعاء. في اختبارات الأداء، يكون Intl.DateTimeFormat أسرع بمقدار 5-10 مرات من toLocaleDateString() في الحلقات.

\n\n

علاوة على ذلك، يدعم Intl.DateTimeFormat خيارات إضافية مثل weekday و hour و minute و second وحتى timeZone:

\n\n
const formatter = new Intl.DateTimeFormat('en-US', {\n  weekday: 'long',\n  year: 'numeric',\n  month: 'short',\n  day: 'numeric',\n  hour: '2-digit',\n  minute: '2-digit'\n});\nconsole.log(formatter.format(new Date())); // "Friday, Feb 14, 2025, 12:00 PM"
\n\n

سؤال صعب: ماذا لو كنت بحاجة إلى عرض التاريخ بتنسيق "2025-02-14" بدون توطين؟ Intl.DateTimeFormat لا يمكنه عرض الساعات والدقائق والثواني بشكل منفصل، ولكن بالنسبة للتواريخ البسيطة فهذا

المدونات

توصيات الكتب