يعد التعامل مع التواريخ في JavaScript أحد أكثر التحديات التي تواجه المطورين، سواء كانوا مبتدئين أو خبراء. للوهلة الأولى، قد يبدو الأمر بسيطًا، ولكن سرعان ما تظهر التعقيدات المتعلقة بالمناطق الزمنية، والتوقيت الصيفي، وتنسيقات العرض المختلفة. إن فهم كيفية إدارة الوقت بفعالية ليس مجرد مهارة تقنية، بل هو ضرورة لبناء تطبيقات قوية وموثوقة. هذا المقال هو وعد لك بأنك ستخرج منه بفهم عميق وشامل، ليس فقط لكيفية عمل كائن Date، بل لكيفية التغلب على أصعب المشكلات التي قد تواجهك.
سنغوص في أعماق كائن Date الأصلي، ونكشف أسرار التنسيق المتقدم باستخدام Intl.DateTimeFormat، ونستعرض كيفية إجراء العمليات الحسابية بدقة. والأهم من ذلك، سنقدم لك دليلاً عملياً لبناء ساعة رقمية تفاعلية، ونقارن بين استخدام JavaScript الأصلي والمكتبات الحديثة مثل date-fns و Luxon، لنمنحك القدرة على اختيار الأداة المناسبة لكل مهمة.
التعامل مع التواريخ في JavaScript يتطلب فهمًا عميقًا لكائن Date الأصلي واستخدام دوال مثل getFullYear() و getMonth(). للحصول على التاريخ الحالي، استخدم new Date()، ولتنسيقه بشكل دقيق ومناسب لمختلف المناطق، يُنصح باستخدام Intl.DateTimeFormat. أما للمشاريع المعقدة التي تتطلب عمليات حسابية متقدمة أو التعامل مع المناطق الزمنية، فإن مكتبات حديثة مثل date-fns و Luxon توفر حلاً أكثر قوة وموثوقية.
لماذا يمثل التعامل مع التواريخ في JavaScript تحديًا حقيقيًا؟
التعامل مع الوقت في البرمجة ليس مجرد أرقام، بل هو مفهوم مرتبط بشدة بالسياق الجغرافي والثقافي. أول وأكبر تحدٍ في JavaScript هو أن كائن Date الأصلي، الذي تم تصميمه في الأيام الأولى للغة، يحمل معه بعض القرارات التصميمية التي تسبب ارتباكًا. على سبيل المثال، يبدأ ترقيم الأشهر من الصفر (يناير = 0)، بينما يبدأ ترقيم الأيام من الواحد، وهو ما يمثل مصدرًا شائعًا للأخطاء.
🔰المشكلة الثانية تكمن في المناطق الزمنية (Time Zones). افتراضيًا، يقوم JavaScript باستخدام المنطقة الزمنية لجهاز المستخدم. هذا يعني أن نفس الكود قد ينتج عنه أوقات مختلفة تمامًا عند تشغيله في الرياض مقارنة بتشغيله في نيويورك. هذا السلوك يسبب كوابيس في التطبيقات التي تحتاج إلى توحيد الوقت عالميًا، مثل أنظمة الحجوزات أو المنصات الاجتماعية.
🔰التحدي الثالث هو التوقيت الصيفي (Daylight Saving Time - DST). تتغير الساعات في العديد من البلدان مرتين في السنة، مما يخلق "ساعات غير موجودة" أو "ساعات مكررة". كائن Date الأصلي لا يوفر طريقة سهلة ومباشرة للتعامل مع هذه التحولات المعقدة، مما قد يؤدي إلى حسابات خاطئة بفارق ساعة كاملة.
🔰أخيرًا، تحليل التواريخ من النصوص (Parsing) هو حقل ألغام. عند محاولة تحويل نص مثل "10/12/2024" إلى كائن تاريخ، قد يفسره متصفح بشكل مختلف عن الآخر (هل هو 10 ديسمبر أم 12 أكتوبر؟). هذا النقص في التوحيد يجعل الاعتماد على تحليل النصوص مباشرة أمرًا محفوفًا بالمخاطر. هذه التحديات مجتمعة تجعل من الضروري فهم الأساسيات بعمق ومعرفة متى يجب اللجوء إلى أدوات أكثر تخصصًا.
أساسيات لا غنى عنها: فهم كائن Date الأصلي
لفهم كيفية التعامل مع التواريخ في JavaScript، يجب أن نبدأ من حجر الأساس: كائن Date. هذا الكائن هو الطريقة المدمجة في اللغة لتمثيل لحظة زمنية معينة. داخليًا، يقوم JavaScript بتخزين كل تاريخ على شكل رقم واحد ضخم يمثل عدد المللي ثانية التي انقضت منذ منتصف ليل 1 يناير 1970 بالتوقيت العالمي المنسق (UTC)، وهو ما يعرف بـ "عصر يونكس" (Unix Epoch).
إليك الطرق الأساسية لإنشاء كائن تاريخ جديد:
- للحصول على التاريخ والوقت الحاليين:
const now = new Date();
- لإنشاء تاريخ محدد: يجب تمرير السنة، الشهر (يبدأ من 0)، اليوم، الساعة، الدقيقة، الثانية.
// إنشاء تاريخ 25 ديسمبر 2025، الساعة 10:30 صباحًا
const specificDate = new Date(2025, 11, 25, 10, 30, 0);
- من خلال نص (غير موصى به للإنتاج): يمكن إنشاء تاريخ من نص، لكن يجب الحذر لأن المتصفحات قد تفسره بشكل مختلف. المعيار الأكثر أمانًا هو ISO 8601.
const fromISOString = new Date("2025-12-25T10:30:00Z"); // Z تعني UTC
بمجرد إنشاء كائن التاريخ، يمكنك استخدام مجموعة من دوال "getter" لاستخراج أجزاء منه. إليك أهم هذه الدوال:
- getFullYear(): تعيد السنة المكونة من 4 أرقام (مثل 2025).
- getMonth(): تعيد الشهر كرقم بين 0 و 11 (0 ليناير، 11 لديسمبر).
- getDate(): تعيد يوم الشهر كرقم بين 1 و 31.
- getDay(): تعيد يوم الأسبوع كرقم بين 0 و 6 (0 للأحد، 6 للسبت).
- getHours(): تعيد الساعة (0-23).
- getMinutes(): تعيد الدقائق (0-59).
- getSeconds(): تعيد الثواني (0-59).
- getTime(): تعيد عدد المللي ثانية منذ عصر يونكس، وهو مفيد جدًا للمقارنات والحسابات.
✍️بجانب دوال "getter"، توجد دوال "setter" مقابلة (مثل setFullYear(), setMonth()) لتعديل أجزاء من التاريخ. من المهم ملاحظة أن هذه الدوال تعدل كائن التاريخ الأصلي مباشرة (mutable)، وهو سلوك قد يؤدي إلى أخطاء غير متوقعة في التطبيقات المعقدة.
تنسيق وعرض التواريخ: من toString إلى Intl.DateTimeFormat
عرض التاريخ للمستخدم بتنسيق مفهوم وجذاب هو جزء أساسي من أي تطبيق. يوفر JavaScript عدة طرق مدمجة لتحويل كائن Date إلى نص، ولكنها غالبًا ما تكون محدودة وغير مرنة. الطريقة الأساسية هي toString()، التي تعيد نصًا طويلاً يعتمد على المنطقة الزمنية للمتصفح، مثل "Fri Aug 08 2025 12:30:00 GMT+0300".
للحصول على تحكم أكبر، يمكنك استخدام دوال أخرى مثل:
- toDateString(): تعرض التاريخ فقط (مثل "Fri Aug 08 2025").
- toTimeString(): تعرض الوقت فقط (مثل "12:30:00 GMT+0300").
- toLocaleDateString(): تعرض التاريخ بتنسيق محلي حسب لغة المتصفح.
- toISOString(): تعرض التاريخ بتنسيق ISO 8601 العالمي (مثل "2025-08-08T09:30:00.000Z")، وهي الطريقة المفضلة عند إرسال التواريخ إلى الخادم.
لكن الأداة الأقوى والأكثر مرونة لتنسيق التواريخ في JavaScript الحديث هي كائن Intl.DateTimeFormat. هذه الواجهة البرمجية (API) هي جزء من مواصفات التدويل (Internationalization) في ECMAScript، وهي مصممة خصيصًا لعرض الأرقام والتواريخ والأسماء بتنسيقات تتناسب مع أي لغة أو منطقة في العالم.
إليك مثال بسيط يوضح قوة Intl.DateTimeFormat:
const date = new Date();
// إعداد المنسق للغة العربية (مصر) مع عرض تفاصيل كاملة
const formatter = new Intl.DateTimeFormat('ar-EG', {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'Africa/Cairo'
});
console.log(formatter.format(date));
// الناتج قد يكون: "٨ أغسطس ٢٠٢٥ في ١٢:٣٠ م"
باستخدام Intl.DateTimeFormat، يمكنك التحكم الكامل في كل جزء من أجزاء التاريخ المعروض، وتحديد المنطقة الزمنية بدقة، وضمان أن تطبيقك يتحدث لغة المستخدم حرفيًا، مما يجعله الخيار الاحترافي لتنسيق التواريخ في أي مشروع جاد.
إجراء العمليات الحسابية على التواريخ (إضافة، طرح، مقارنة)
القدرة على إجراء عمليات حسابية على التواريخ هي متطلب شائع في العديد من التطبيقات. سواء كنت تريد حساب تاريخ انتهاء صلاحية، أو تحديد المدة المتبقية على حدث ما، فإن فهم كيفية التلاعب بالتواريخ أمر بالغ الأهمية. الطريقة الأكثر موثوقية لإجراء هذه العمليات هي عبر التعامل مع التواريخ كطوابع زمنية (timestamps) بالمللي ثانية.
- مقارنة التواريخ:
لمقارنة تاريخين، لا تقارن الكائنات مباشرة باستخدام == أو ===، لأن هذا سيقارن مراجع الكائنات في الذاكرة وليس قيمها. بدلًا من ذلك، قم بتحويل التاريخين إلى أرقام باستخدام دالة getTime() ثم قارن الأرقام الناتجة.
const date1 = new Date('2025-01-01');
const date2 = new Date('2025-01-02');
if (date2.getTime() > date1.getTime()) {
console.log("التاريخ الثاني أحدث من الأول");
}
- حساب الفرق بين تاريخين:
لطرح تاريخين، قم أولاً بتحويلهما إلى طوابع زمنية ثم اطرح القيم. النتيجة ستكون بالمللي ثانية، ويمكنك بعد ذلك تحويلها إلى ثوانٍ أو دقائق أو أيام حسب الحاجة.
const startDate = new Date('2025-01-01');
const endDate = new Date('2025-01-11');
const differenceInMs = endDate.getTime() - startDate.getTime();
const differenceInDays = differenceInMs / (1000 * 60 * 60 * 24);
console.log(`الفرق هو ${differenceInDays} أيام.`); // الناتج: 10
- إضافة أو طرح مدة زمنية:
لإضافة أو طرح أيام أو أشهر أو سنوات، يمكنك استخدام دوال setter مثل setDate() و setMonth(). هذه الدوال ذكية بما يكفي للتعامل مع تجاوز الشهور أو السنوات تلقائيًا.
const today = new Date(); // لنفترض اليوم هو 8 أغسطس 2025
// لإضافة 10 أيام
today.setDate(today.getDate() + 10);
console.log(today.toDateString()); // الناتج: "Mon Aug 18 2025"
// لطرح شهرين
today.setMonth(today.getMonth() - 2);
console.log(today.toDateString()); // الناتج: "Thu Jun 18 2025"
على الرغم من أن هذه الطرق تعمل، إلا أنها يمكن أن تصبح معقدة عند التعامل مع حالات خاصة مثل السنوات الكبيسة أو نهايات الشهور. لهذا السبب، غالبًا ما توفر المكتبات الخارجية واجهة برمجية أبسط وأكثر أمانًا لإجراء هذه العمليات الحسابية المعقدة.
الوحش الخفي: كيف تتقن التعامل مع المناطق الزمنية (Time Zones) و UTC
التعامل مع المناطق الزمنية هو المصدر الأكبر للأخطاء والصداع عند التعامل مع التواريخ في JavaScript. بشكل افتراضي، تعمل جميع دوال Date (مثل getHours() و getDate()) في المنطقة الزمنية المحلية للمتصفح. هذا يعني أن المستخدم في طوكيو سيرى وقتًا مختلفًا عن المستخدم في لندن لنفس الطابع الزمني. لحل هذه المشكلة، يجب فهم مفهومين أساسيين: التوقيت المحلي (Local Time) والتوقيت العالمي المنسق (UTC).
UTC هو معيار زمني عالمي لا يتأثر بالمناطق الجغرافية أو التوقيت الصيفي. القاعدة الذهبية في تطوير التطبيقات هي: "خزّن دائمًا التواريخ في قاعدة البيانات بتنسيق UTC، وقم بتحويلها إلى التوقيت المحلي للمستخدم عند العرض فقط".
يوفر كائن Date في JavaScript مجموعة من الدوال للتعامل مع UTC، وهي عادةً نفس الدوال المحلية مع إضافة "UTC" إليها:
- getUTCFullYear()
- getUTCMonth()
- getUTCDate()
- getUTCHours()
عندما تتلقى تاريخًا من الخادم، فمن المرجح أن يكون بتنسيق ISO 8601 مع علامة Z في النهاية، والتي تشير إلى أنه بتوقيت UTC (مثال: "2025-08-08T10:00:00.000Z"). يمكنك إنشاء كائن تاريخ من هذا النص مباشرة، وسيفهم JavaScript أنه يمثل توقيت UTC
const utcDateString = "2025-08-08T10:00:00.000Z";
const dateObject = new Date(utcDateString);
// getHours() سيعرض الوقت بالتوقيت المحلي للمستخدم
// على سبيل المثال، إذا كان المستخدم في منطقة زمنية +3 ساعات
console.log(dateObject.getHours()); // سيطبع 13
// getUTCHours() سيعرض الوقت دائمًا بتوقيت UTC
console.log(dateObject.getUTCHours()); // سيطبع 10
👈دالة getTimezoneOffset() يمكن أن تكون مفيدة أيضًا، حيث تعيد الفارق بالدقائق بين توقيت UTC والتوقيت المحلي للمستخدم.
على الرغم من وجود هذه الأدوات المدمجة، فإن التعامل الدقيق مع التحويلات بين المناطق الزمنية المختلفة (وليس فقط بين المحلي و UTC) والتوقيت الصيفي يظل معقدًا للغاية باستخدام JavaScript الأصلي. هنا تتألق المكتبات المتخصصة مثل Luxon، التي بنيت خصيصًا لحل هذه المشاكل المعقدة وتوفر دعمًا كاملاً للمناطق الزمنية المختلفة.
دليل عملي: بناء ساعة رقمية تفاعلية خطوة بخطوة
لا شيء يرسخ المفاهيم النظرية مثل التطبيق العملي. في هذا القسم، سنقوم ببناء ساعة رقمية بسيطة تعرض الوقت الحالي وتتحدث كل ثانية. هذا المشروع الصغير سيجمع كل ما تعلمناه عن الحصول على الوقت وتنسيقه وتحديثه.
الخطوة 1: إعداد ملف HTML
أولاً، نحتاج إلى مكان لعرض الساعة. أنشئ ملف index.html وأضف عنصرًا بسيطًا سيحتوي على الوقت.
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<title>ساعة رقمية</title>
<style>
body { display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #222; color: #0f0; font-family: monospace; font-size: 4rem; }
</style>
</head>
<body>
<div id="digital-clock"></div>
</body>
</html>
الخطوة 2: كتابة كود JavaScript
الآن، سنكتب الكود الذي سيجعل الساعة تعمل. سنقوم بإنشاء دالة لجلب الوقت الحالي وتنسيقه، ثم نستخدم setInterval لتشغيل هذه الدالة كل ثانية.
أضف هذا الكود في ملف script.js واربطه بملف HTML، أو ضعه داخل وسم <script> في نهاية <body>.
// 1. تعريف دالة لعرض الوقت
function displayTime() {
// 2. الحصول على الوقت الحالي
const now = new Date();
// 3. استخراج الساعات والدقائق والثواني
let hours = now.getHours();
let minutes = now.getMinutes();
let seconds = now.getSeconds();
// 4. إضافة صفر في البداية إذا كان الرقم أقل من 10
hours = hours < 10 ? '0' + hours : hours;
minutes = minutes < 10 ? '0' + minutes : minutes;
seconds = seconds < 10 ? '0' + seconds : seconds;
// 5. تجميع النص النهائي للوقت
const timeString = `${hours}:${minutes}:${seconds}`;
// 6. عرض الوقت في عنصر HTML
document.getElementById('digital-clock').textContent = timeString;
}
// 7. تشغيل الدالة كل ثانية (1000 مللي ثانية)
setInterval(displayTime, 1000);
// 8. استدعاء الدالة مرة واحدة عند بدء التشغيل لتجنب التأخير
displayTime();
هذا الدليل العملي يوضح كيفية استخدام new Date() للحصول على الوقت، ودوال getter لاستخراج مكوناته، وكيفية تنسيق النص، وتحديث واجهة المستخدم بشكل دوري. هذا المبدأ هو أساس بناء واجهات مستخدم تفاعلية وحديثة وهو مثال ممتاز على تطبيق أساسيات التعامل مع التواريخ في JavaScript في مشروع حقيقي.
متى ولماذا تختار المكتبات الخارجية؟ (مقارنة بين date-fns و Luxon)
على الرغم من أن كائن Date الأصلي و Intl API يمكنهما التعامل مع العديد من المهام، إلا أنهما يصبحان محدودين ومعقدين عند مواجهة متطلبات متقدمة. هنا يأتي دور المكتبات الخارجية التي توفر واجهة برمجية (API) أكثر قوة وسهولة في الاستخدام. المكتبتان الأكثر شهرة حاليًا هما date-fns و Luxon (بعد أن أصبحت Moment.js مكتبة قديمة وغير موصى بها للمشاريع الجديدة).
لماذا تستخدم مكتبة خارجية؟
- سهولة الاستخدام✅: تقدم المكتبات دوالاً واضحة ومباشرة لعمليات معقدة مثل "إضافة 3 أسابيع وشهرين" أو "حساب الفرق بالأيام بين تاريخين".
- التعامل المتقدم مع المناطق الزمنية✅: مكتبة مثل Luxon مبنية حول مفهوم المناطق الزمنية، مما يجعل التحويل بينها أمرًا سهلاً وموثوقًا.
- الثبات (Immutability)✅: على عكس كائن Date الأصلي، فإن العمليات في هذه المكتبات لا تعدل التاريخ الأصلي، بل تعيد كائن تاريخ جديدًا. هذا يمنع حدوث أخطاء جانبية غير متوقعة.
- تحليل النصوص (Parsing)✅: توفر قدرات تحليل قوية وموحدة للنصوص من مختلف التنسيقات.
إليك جدول مقارنة لمساعدتك في اتخاذ القرار:
الميزة | JavaScript الأصلي (Vanilla JS) | date-fns | Luxon |
---|---|---|---|
سهولة الاستخدام | متوسطة إلى صعبة للمهام المعقدة | ممتازة، تشبه دوال JS الأصلية | ممتازة، واجهة برمجية حديثة |
حجم الحزمة | لا يوجد (مدمج) | صغير جدًا (يمكن استيراد الدوال بشكل فردي) | صغير نسبيًا |
دعم المناطق الزمنية | محدود (UTC والمحلي فقط) | يتطلب إضافة (date-fns-tz) | ممتاز ومدمج بالكامل |
الثبات (Immutability) | لا (Mutable) | نعم (Immutable) | نعم (Immutable) |
مثال تنسيق تاريخ | new Intl.DateTimeFormat(...) | format(date, 'yyyy-MM-dd') | dt.toFormat('yyyy-MM-dd') |
متى تختار date-fns؟
اختر date-fns إذا كنت تريد مكتبة خفيفة جدًا، وتفضل استيراد الدوال التي تحتاجها فقط (Tree-shaking)، وتحب أسلوب البرمجة الوظيفية. إنها مثالية للمشاريع التي تحتاج إلى عمليات بسيطة إلى متوسطة ولا تركز بشكل كبير على التحويلات المعقدة بين المناطق الزمنية.
متى تختار Luxon؟
اختر Luxon إذا كان تطبيقك يعتمد بشكل كبير على المناطق الزمنية، أو إذا كنت تحتاج إلى واجهة برمجية كائنية التوجه (Object-Oriented) وسلسة (chainable). إنها الخيار الأقوى للمشاريع العالمية والتطبيقات المعقدة.
الخلاصة: خطواتك التالية لإتقان التعامل مع التواريخ
لقد قطعنا رحلة طويلة في عالم التواريخ، من فهم الأساسيات المربكة لكائن Date الأصلي إلى استكشاف قوة المكتبات الحديثة. الآن، لديك خريطة طريق واضحة لتصبح خبيرًا في هذا المجال. ابدأ دائمًا باستخدام الأدوات المدمجة للمهام البسيطة، مثل الحصول على الوقت الحالي أو تنسيقه باستخدام Intl.DateTimeFormat.
📖عندما تبدأ المتطلبات في التعقيد، مثل الحاجة إلى عمليات حسابية دقيقة، أو التعامل مع الفترات الزمنية، أو دعم المناطق الزمنية المختلفة، لا تتردد في تبني مكتبة خارجية. date-fns هي نقطة انطلاق ممتازة بفضل بساطتها وحجمها الصغير، بينما Luxon هي الحل الأمثل للتطبيقات العالمية التي تتطلب دقة متناهية في التعامل مع المناطق الزمنية.
تذكر دائمًا القاعدة الذهبية: خزّن التواريخ بتوقيت UTC في الخلفية، وقم بتحويلها إلى التوقيت المحلي للمستخدم في الواجهة الأمامية. هذا المبدأ وحده سيجنبك عددًا لا يحصى من المشاكل. الاستمرار في الممارسة والتجربة هو مفتاحك لإتقان فن التعامل مع التواريخ في JavaScript بشكل كامل، ولا تنسَ حفظ إصدارات مشروعك لتتبع تطورك.
أسئلة شائعة
كيف أحصل على التاريخ والوقت الحالي بتنسيق "YYYY-MM-DD" في JavaScript؟
يمكنك تحقيق ذلك بسهولة باستخدام دوال كائن Date وتنسيق النص يدويًا، مع التأكد من إضافة صفر للأرقام الفردية.
const date = new Date();
const year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
month = month < 10 ? '0' + month : month;
day = day < 10 ? '0' + day : day;
console.log(`${year}-${month}-${day}`);
ما هو أفضل بديل لمكتبة Moment.js المتوقفة؟
أفضل البدائل الحديثة هي Luxon و date-fns. Luxon تم تطويرها بواسطة نفس فريق Moment.js وتقدم واجهة برمجية محسنة مع دعم ممتاز للمناطق الزمنية. date-fns هي مكتبة خفيفة جدًا ووظيفية، وتسمح باستيراد الدوال التي تحتاجها فقط.
كيف أتعامل مع خطأ "Invalid Date" في جافاسكريبت؟
يظهر هذا الخطأ عادة عند محاولة تحليل نص تاريخ غير صالح. للتحقق مما إذا كان كائن التاريخ صالحًا، يمكنك استخدام دالة isNaN() على نتيجة getTime().
const myDate = new Date("نص تاريخ غير صالح");
if (isNaN(myDate.getTime())) {
console.log("هذا تاريخ غير صالح!");
}
ما الفرق الجوهري بين getTime() و valueOf() في كائن Date؟
لا يوجد فرق جوهري في القيمة التي يعيدانها؛ كلاهما يعيد عدد المللي ثانية منذ عصر يونكس. الفرق يكمن في الاستخدام. getTime() هي دالة صريحة، بينما valueOf() يتم استدعاؤها ضمنيًا عندما يحاول JavaScript تحويل كائن التاريخ إلى قيمة أولية (primitive)، مثل عند إجراء عمليات حسابية (date1 - date2).
كيف يمكنني إضافة 10 أيام إلى تاريخ معين بسهولة؟
استخدم دالة setDate() مع getDate(). ستقوم JavaScript تلقائيًا بالتعامل مع الانتقال إلى الشهر التالي إذا لزم الأمر.
const date = new Date();
date.setDate(date.getDate() + 10);
console.log("التاريخ بعد 10 أيام:", date);
لماذا يعطي getMonth() الرقم 7 لشهر أغسطس بدلاً من 8؟
لأن ترقيم الأشهر في كائن Date في JavaScript يبدأ من الصفر. يناير هو الشهر 0، فبراير هو 1، وهكذا حتى ديسمبر الذي هو الشهر 11. لذلك، أغسطس (الشهر الثامن في التقويم) يكون ترتيبه 7. تذكر دائمًا إضافة 1 إلى نتيجة getMonth() عند عرضها للمستخدم.