دعم التقويم الهجري أكثر تعقيداً مما يبدو، وأخطاؤه مكلفة: موعد يظهر بيوم خاطئ، أو تقرير مالي بفترة غير صحيحة، أو اشتراك ينتهي قبل أوانه.
القاعدة الذهبية التي يختصرها هذا الدليل: خزّن دائماً بالميلادي، وحوّل عند العرض فقط.
التواريخ طبقة واحدة من التعريب. للنطاق الكامل — تخطيط RTL والطباعة والأرقام وتكييف المحتوى — راجع الدليل الكامل لتعريب التطبيقات والمواقع.
القاعدة الأولى: الفصل بين التخزين والعرض
هذا أهم قرار معماري في التعامل مع التواريخ.
خزّن بالميلادي (UTC) دائماً. في قاعدة البيانات، في الـAPI، في السجلات. الأسباب:
- الحساب أبسط — فروق الأيام والترتيب الزمني والمقارنات تعمل بلا مفاجآت.
- التوافق — كل المكتبات وقواعد البيانات تفترض الميلادي.
- لا لبس — التقويم الهجري له تطبيقات متعددة (انظر أدناه)، فتخزينه يعني تخزين غموض.
حوّل للهجري عند العرض فقط — في طبقة الواجهة، بحسب تفضيل المستخدم.
// ✅ الصحيح: تخزين ميلادي، عرض هجري
const stored = new Date('2026-08-14T10:00:00Z'); // في قاعدة البيانات
const shown = new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura', {
dateStyle: 'long'
}).format(stored); // عند العرض
// ❌ الخطأ: تخزين نص هجري
{ date: '١٤٤٨/٠٢/٢٠' } // لا يمكن ترتيبه ولا حساب فروقه بموثوقية
القاعدة الثانية: لا يوجد تقويم هجري واحد
هذه النقطة تفاجئ كثيراً من المطورين وهي مصدر أخطاء «اليوم الواحد».
التقويم الهجري قمري، وبداية الشهر تعتمد على رؤية الهلال. لهذا توجد تطبيقات متعددة تختلف بيوم أحياناً:
| التقويم | الوصف | الاستخدام |
|---|---|---|
| أم القرى | التقويم الرسمي في السعودية | المعيار للسوق السعودي |
| مدني/حسابي | حسابي بلا رؤية | تقديرات عامة |
| مدني تقليدي | صيغ حسابية مختلفة | تطبيقات متنوعة |
للسوق السعودي استخدم أم القرى — هو المعتمد رسمياً، والفرق عن غيره قد يبلغ يوماً كاملاً، وهو ما يكفي لإفساد موعد أو استحقاق.
// أم القرى تحديداً
new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura', { dateStyle: 'long' })
// ⚠️ 'islamic' وحده قد يعطي تقويماً مختلفاً
التحويل في المتصفح — Intl مدمج
معظم الاحتياجات يغطيها Intl.DateTimeFormat بلا أي مكتبة:
const date = new Date('2026-08-14');
// هجري بأرقام هندية
new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura', {
dateStyle: 'full'
}).format(date);
// هجري بأرقام لاتينية
new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura-nu-latn', {
year: 'numeric', month: 'long', day: 'numeric'
}).format(date);
// عرض التقويمين معاً — مفيد جداً في الواجهات
const g = new Intl.DateTimeFormat('ar', { dateStyle: 'long' }).format(date);
const h = new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura', { dateStyle: 'long' }).format(date);
// `${h} (${g})`
اختبر مخرجات Intl على متصفحاتك المستهدفة فعلياً — دعم التقويمات يتفاوت بين البيئات، وخصوصاً في بيئات الخادم القديمة.
التحويل في Flutter
Flutter لا يدعم التقويم الهجري افتراضياً وتحتاج مكتبة متخصصة.
عند اختيار المكتبة، تحقّق من:
- هل تدعم أم القرى تحديداً لا الحسابي العام؟
- ما نطاق السنوات المدعوم؟ بعض المكتبات دقيقة في نطاق محدود.
- هل هي مصانة؟ راجع تاريخ آخر تحديث.
اختبر بتواريخ حقيقية تعرف مقابلها الصحيح — خصوصاً حول بدايات الشهور حيث تتركز الأخطاء.
الأخطاء الشائعة
1. تخزين التاريخ الهجري كنص. يمنع الترتيب والمقارنة والحساب. خزّن ميلادياً دائماً.
2. حساب الفروق بالهجري. الشهر الهجري 29 أو 30 يوماً بلا نمط ثابت. احسب الفروق بالميلادي ثم اعرض النتيجة.
3. افتراض أن السنة 12 شهراً بطول ثابت. السنة الهجرية أقصر من الميلادية بنحو 11 يوماً — «سنة اشتراك» بالهجري أقصر من الميلادية.
4. تجاهل المنطقة الزمنية. بداية اليوم الهجري ترتبط بالمغرب لا بمنتصف الليل في بعض السياقات الشرعية. للتطبيقات الإدارية المعتادة استخدم اليوم التقويمي، ولا تفترض ذلك في السياقات الدينية.
5. استخدام islamic بدل islamic-umalqura. فرق يوم كامل أحياناً.
6. عرض الهجري فقط. كثير من المستخدمين يفكرون بالميلادي في السياقات التجارية. اعرض التقويمين معاً في المواعيد والاستحقاقات — يزيل اللبس بلا تكلفة.
قرارات المنتج
أي تقويم افتراضي؟ للجمهور السعودي، الهجري افتراضاً في السياقات الرسمية والحكومية، والميلادي في التجارية والتقنية. الأفضل: اتركها تفضيلاً للمستخدم مع افتراض معقول.
العرض المزدوج. في المواعيد والاستحقاقات والفواتير، اعرض التقويمين. الكلفة صفر والفائدة كبيرة.
التقارير المالية. حدّد صراحةً أي تقويم تستخدمه — تقرير «الربع الأول» يختلف جوهرياً بين التقويمين. اذكرها في عنوان التقرير لا في حاشية.
المواسم. رمضان والحج مواسم ذروة لكثير من الأنشطة، ومواعيدها تتحرك سنوياً بالميلادي. إن كان تطبيقك يتأثر بها، فالحساب الهجري يمنحك تخطيطاً أدق.
قائمة اختبار
- كل التواريخ مخزّنة ميلادياً (UTC) في قاعدة البيانات والـAPI.
- التحويل يحدث في طبقة العرض فقط.
- استخدام أم القرى تحديداً للسوق السعودي.
- اختبار حول بدايات الشهور — حيث تتركز أخطاء اليوم الواحد.
- اختبار نهاية السنة الهجرية وبدايتها.
- حساب الفروق والمدد يتم بالميلادي.
- عرض مزدوج في المواعيد والاستحقاقات.
- الأرقام بنمط متسق (هندية أو لاتينية) عبر التطبيق.
- اختبار على المتصفحات وبيئات الخادم المستهدفة فعلياً.
اقرأ أيضاً
- دعم العربية وRTL في Flutter — الجانب الآخر من التعريب.
- الخطوط العربية على الويب — عرض الأرقام والخطوط.
- اختبار تطبيقات الجوال — اختبر حول بدايات الشهور.
- ما هو Flutter؟ — الإطار الذي تُبنى به معظم التطبيقات العربية.
- تكلفة تطوير تطبيق في الخليج — التعريب بند تكلفة حقيقي.
- تكلفة تطبيق حجز مواعيد للعيادات — التقويم الهجري في نظام حجز فعلي.
الأسئلة الشائعة
هل أخزّن التاريخ هجرياً أم ميلادياً؟
ميلادياً دائماً (UTC) في قاعدة البيانات والـAPI، وحوّل للهجري عند العرض فقط. تخزين الهجري يمنع الترتيب الموثوق وحساب الفروق، ويثبّت تطبيقاً معيناً للتقويم قد لا يكون ما تريده لاحقاً.
ما الفرق بين أم القرى والتقويم الهجري العام؟
أم القرى هو التقويم الرسمي المعتمد في السعودية، ويعتمد معايير محددة لبدايات الشهور. التقويمات الحسابية العامة قد تختلف عنه بيوم. للسوق السعودي استخدم أم القرى تحديداً — الفرق كافٍ لإفساد موعد أو استحقاق.
هل يدعم JavaScript التقويم الهجري؟
نعم عبر Intl.DateTimeFormat مع ar-SA-u-ca-islamic-umalqura — بلا أي مكتبة خارجية. لكن اختبر على بيئاتك المستهدفة، فدعم التقويمات يتفاوت خصوصاً في بيئات الخادم القديمة.
كيف أحسب الفرق بين تاريخين هجريين؟
حوّلهما للميلادي واحسب الفرق هناك، ثم اعرض النتيجة. الشهر الهجري 29 أو 30 يوماً بلا نمط ثابت، فالحساب المباشر بالهجري مصدر أخطاء.
هل أعرض التقويمين معاً؟
في المواعيد والاستحقاقات والفواتير: نعم بقوة. التكلفة صفر والفائدة كبيرة — تزيل اللبس عن مستخدم يفكر بالتقويم الآخر. في المحتوى العام، اكتفِ بتفضيل المستخدم.
ماذا عن السنة المالية والاشتراكات؟
السنة الهجرية أقصر من الميلادية بنحو 11 يوماً. اشتراك «سنوي» بالهجري أقصر فعلياً — حدّد صراحةً في الشروط أي تقويم يحكم المدة، واحسب تواريخ التجديد بالميلادي داخلياً.
الخلاصة
خزّن ميلادياً، اعرض هجرياً — القاعدة التي تمنع معظم المشاكل.
استخدم أم القرى تحديداً للسوق السعودي، لا التقويم الحسابي العام.
احسب الفروق بالميلادي دائماً — الشهر الهجري متغير الطول.
واعرض التقويمين معاً في المواعيد والاستحقاقات — بلا تكلفة وبفائدة كبيرة.
تبني منتجاً للسوق السعودي؟ تواصل معنا — نراعي هذه التفاصيل في التصميم. اطّلع على خدمات تطوير التطبيقات.