كيف أعرض السنة والحقبة في التقاويم غير الميلادية؟

استخدم خيارات calendar و era في Intl.DateTimeFormat لعرض السنوات والحقب من التقاويم الإسلامية والعبرية والصينية والفارسية وأنظمة التقويم الأخرى

مقدمة

يحسب التقويم الميلادي السنوات من نقطة بداية واحدة، مما يجعل سنة 2024 رقماً مباشراً. أنظمة التقويم الأخرى تحسب السنوات بشكل مختلف. يحسب التقويم الإسلامي من سنة 622 م. يحسب التقويم العبري من تاريخ الخلق التقليدي قبل آلاف السنين. يستخدم التقويم الصيني دورة مدتها 60 عاماً من السنوات المسماة بدلاً من الأرقام المتسلسلة.

تعني أنظمة العد المختلفة هذه أن نفس اللحظة الزمنية لها تمثيلات سنوية مختلفة عبر التقاويم. 15 أكتوبر 2024 في التقويم الميلادي هو سنة 1446 في التقويم الإسلامي، وسنة 5785 في التقويم العبري، وسنة 2024 (甲辰، jiǎ-chén) في التقويم الصيني.

توفر Intl.DateTimeFormat في JavaScript خيارات لعرض السنوات والحقب من أي نظام تقويم. يحدد خيار calendar التقويم المراد استخدامه. يتحكم خياري year و era في كيفية عرض السنة والحقبة. بالنسبة للتقاويم التي تستخدم سنوات مسماة بدلاً من الأرقام، توفر طريقة formatToParts() إمكانية الوصول إلى كل من اسم السنة والسنة الميلادية المقابلة.

كيف تختلف السنوات عبر أنظمة التقويم

تختلف أنظمة التقويم بثلاث طرق أساسية: من أين تبدأ العد، وكيف ترقم السنوات، وما إذا كانت تستخدم الحقب.

يبدأ التقويم الميلادي العد من سنة 1 م ويزداد بشكل متسلسل. يبدأ التقويم الإسلامي من سنة 1 هـ (بعد الهجرة) في 622 م. يبدأ التقويم العبري من سنة 1 في 3761 ق.م. لكل تقويم حقبته الخاصة، وهي النقطة التي يبدأ فيها عد السنوات.

تستخدم بعض التقاويم أرقام سنوات متسلسلة تزداد إلى الأبد. تعمل التقاويم الميلادية والإسلامية والعبرية والفارسية بهذه الطريقة. تستخدم تقاويم أخرى دورات تتكرر فيها أسماء السنوات. يستخدم التقويم الصيني دورة مدتها 60 عامًا من السنوات المسماة. بعد 60 عامًا، تتكرر الدورة.

تقسم الحقب الزمنية الوقت إلى فترات مسماة. يستخدم التقويم الميلادي قبل الميلاد وبعد الميلاد. يستخدم التقويم الياباني أسماء الحقب الإمبراطورية. تستخدم التقاويم الإسلامية والعبرية عادةً حقبة واحدة بدأت في عصرها. لا يستخدم التقويم الصيني الحقب بنفس الطريقة، بل يعتمد على السنوات المسماة ضمن الدورات.

عرض السنوات في التقويم الإسلامي

يحسب التقويم الإسلامي السنوات من الهجرة، هجرة محمد من مكة إلى المدينة في عام 622 ميلادي. تتوافق السنة الإسلامية الأولى مع السنة الميلادية 622. يستخدم التقويم الإسلامي أشهرًا قمرية، مما يجعل سنواته أقصر من السنوات الميلادية. هذا يعني أن السنة الإسلامية تتقدم بشكل أسرع، حيث تصل حاليًا إلى عام 1446 عندما تكون السنة الميلادية 2024.

تحدد التقويم الإسلامي باستخدام خيار calendar بالقيمة islamic أو بإضافة امتداد Unicode -u-ca-islamic إلى معرف اللغة المحلية.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Rabi' II 12, 1446 AH"

تظهر السنة كـ 1446، وهي السنة الإسلامية المقابلة لـ 15 أكتوبر 2024. تظهر الحقبة "AH" (بعد الهجرة) تلقائيًا عند عرض التواريخ الإسلامية باللغة الإنجليزية.

تنسق اللغات المحلية المختلفة التواريخ الإسلامية وفقًا لاتفاقياتها.

const date = new Date('2024-10-15');

const en = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(en.format(date));
// "Rabi' II 12, 1446 AH"

const ar = new Intl.DateTimeFormat('ar-SA', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(ar.format(date));
// "١٢ ربيع الآخر ١٤٤٦ هـ"

تستخدم اللغة المحلية العربية الأرقام العربية الهندية وتعرض اسم الشهر بالعربية. يتغير مؤشر الحقبة إلى "هـ" (الاختصار العربي للهجري).

التحكم في عرض الحقبة في التقويم الإسلامي

يتحكم الخيار era في ما إذا كان سيتم عرض مؤشر الحقبة وكيفية عرضه. يقبل الخيار ثلاث قيم: long للاسم الكامل للحقبة، وshort للاختصار، وnarrow للشكل الأكثر اختصاراً.

const date = new Date('2024-10-15');

const long = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  era: 'long'
});
console.log(long.format(date));
// "1446 Anno Hegirae"

const short = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  era: 'short'
});
console.log(short.format(date));
// "1446 AH"

const narrow = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  era: 'narrow'
});
console.log(narrow.format(date));
// "1446 A"

تنتج القيمة long "Anno Hegirae" (باللاتينية تعني "في سنة الهجرة"). تنتج القيمة short "AH". تنتج القيمة narrow الحرف "A" فقط.

أشكال التقويم الإسلامي

يحتوي التقويم الإسلامي على عدة أشكال تستخدم طرق حساب مختلفة. تدعم JavaScript خمسة أشكال: islamic، وislamic-civil، وislamic-tbla، وislamic-umalqura، وislamic-rgsa.

يستخدم الشكل islamic-umalqura التقويم الرسمي للمملكة العربية السعودية، والذي يعتمد على الرصد الفلكي. يستخدم الشكل islamic-civil حساباً حسابياً ثابتاً مع أشهر متناوبة من 29 و30 يوماً.

const date = new Date('2024-10-15');

const umalqura = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic-umalqura',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(umalqura.format(date));
// "Rabi' II 12, 1446 AH"

const civil = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic-civil',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(civil.format(date));
// "Rabi' II 11, 1446 AH"

يمكن أن تنتج الأشكال أرقام أيام مختلفة لنفس التاريخ الميلادي لأنها تستخدم طرق حساب مختلفة لتحديد حدود الأشهر.

عرض السنوات في التقويم العبري

يحسب التقويم العبري السنوات من تاريخ الخلق التقليدي في عام 3761 قبل الميلاد. وهذا يجعل السنوات العبرية أكبر بكثير من السنوات الميلادية. تقابل السنة العبرية 5785 السنة الميلادية 2024.

يمكنك تحديد التقويم العبري باستخدام الخيار calendar بالقيمة hebrew أو بإضافة امتداد Unicode -u-ca-hebrew إلى معرّف اللغة.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Tishrei 13, 5785"

تُعرض السنة كـ 5785، وهي السنة العبرية المقابلة لـ 15 أكتوبر 2024. التقويم العبري قمري شمسي، مما يعني أن أشهره تتبع القمر لكن سنواته تبقى متزامنة مع السنة الشمسية من خلال أشهر كبيسة دورية.

التواريخ العبرية في اللغة العبرية تستخدم الأرقام العبرية وأسماء الأشهر.

const date = new Date('2024-10-15');

const he = new Intl.DateTimeFormat('he-IL', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(he.format(date));
// "י״ג בתשרי ה׳תשפ״ה"

اللغة العبرية تعرض التاريخ بالكامل بالعبرية، بما في ذلك الحروف العبرية المستخدمة كأرقام.

عرض السنوات في التقويم الصيني

يستخدم التقويم الصيني دورة مدتها 60 عامًا من السنوات المسماة بدلاً من أرقام السنوات المتسلسلة. كل سنة في الدورة لها اسم يتكون من حرفين: جذع سماوي وفرع أرضي. السنة 2024 هي 甲辰 (jiǎ-chén)، والتي تعني "تنين الخشب" في علم التنجيم الصيني التقليدي.

نظرًا لأن التقويم الصيني يستخدم سنوات مسماة، فإن عرضه يتطلب معالجة مختلفة عن التقويمات ذات أرقام السنوات المتسلسلة.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Ninth Month 13, 2024(jiǎ-chén)"

يتضمن الناتج المنسق كلاً من السنة الميلادية 2024 واسم السنة "jiǎ-chén" بين قوسين. يساعد هذا التمثيل المزدوج المستخدمين على فهم كل من اسم السنة الدورية والسنة الميلادية المقابلة.

التواريخ الصينية في اللغة الصينية تُعرض باستخدام الأحرف الصينية.

const date = new Date('2024-10-15');

const zh = new Intl.DateTimeFormat('zh-CN', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(zh.format(date));
// "2024甲辰年九月十三"

اللغة الصينية تعرض اسم السنة باستخدام الأحرف الصينية. يدمج التنسيق اسم السنة بشكل طبيعي في سلسلة التاريخ.

استخراج اسم السنة والسنة ذات الصلة

التقويمات التي تستخدم سنوات مسماة توفر معلومتين: اسم السنة ضمن الدورة والسنة الميلادية المقابلة. تفصل طريقة formatToParts() هذه المعلومات إلى أجزاء متميزة.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('zh-CN', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

const parts = formatter.formatToParts(date);
console.log(parts);

يتضمن مصفوفة الأجزاء إدخالين ذوي صلة:

[
  { type: 'relatedYear', value: '2024' },
  { type: 'yearName', value: '甲辰' },
  // ... other parts
]

يحتوي جزء relatedYear على السنة الميلادية المكونة من أربعة أرقام. يحتوي جزء yearName على اسم السنة الدورية. يتيح لك هذا الفصل استخدام أي من القيمتين أو كليهما في التنسيق المخصص.

يمكنك استخراج هذه الأجزاء لإنشاء عروض تاريخ مخصصة.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('zh-CN', {
  calendar: 'chinese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

const parts = formatter.formatToParts(date);
const yearName = parts.find(p => p.type === 'yearName')?.value;
const relatedYear = parts.find(p => p.type === 'relatedYear')?.value;

console.log(`Year name: ${yearName}`);
// "Year name: 甲辰"

console.log(`Gregorian year: ${relatedYear}`);
// "Gregorian year: 2024"

تعمل هذه التقنية مع أي تقويم يستخدم سنوات أو دورات مسماة.

عرض السنوات في التقويم الفارسي

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

تحدد التقويم الفارسي باستخدام خيار calendar بالقيمة persian أو بإضافة امتداد Unicode -u-ca-persian إلى معرّف اللغة المحلية.

const date = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'persian',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(date));
// "Mehr 24, 1403 AP"

تظهر السنة كـ 1403، وهي السنة الفارسية المقابلة لـ 15 أكتوبر 2024. يظهر العصر "AP" (Anno Persico) في التنسيق الإنجليزي.

التواريخ الفارسية في اللغة المحلية الفارسية تستخدم الأرقام الفارسية وأسماء الأشهر.

const date = new Date('2024-10-15');

const fa = new Intl.DateTimeFormat('fa-IR', {
  calendar: 'persian',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(fa.format(date));
// "۲۴ مهر ۱۴۰۳ ه‍.ش."

تعرض اللغة المحلية الفارسية التاريخ باستخدام الأحرف والأرقام الفارسية (الفارسية). مؤشر العصر "ه‍.ش." هو الاختصار الفارسي لعصر الهجري الشمسي.

دمج خيارات التقويم والعصر

يمكنك دمج خيارات calendar و era للتحكم بدقة في كيفية عرض السنوات والعصور عبر أنظمة التقويم المختلفة. يمنحك هذا المزيج تحكماً دقيقاً في تنسيق التاريخ.

const date = new Date('2024-10-15');

const gregorian = new Intl.DateTimeFormat('en-US', {
  calendar: 'gregory',
  year: 'numeric',
  month: 'long',
  era: 'short'
});
console.log(gregorian.format(date));
// "October 2024 AD"

const islamic = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  era: 'short'
});
console.log(islamic.format(date));
// "Rabi' II 1446 AH"

const hebrew = new Intl.DateTimeFormat('en-US', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  era: 'short'
});
console.log(hebrew.format(date));
// "Tishrei 5785"

تعرض التواريخ الميلادية والإسلامية مؤشرات العصر الخاصة بها لأن خيار era محدد. لا يظهر التاريخ العبري مؤشر عصر في هذا التنسيق، حيث أن تنسيق التقويم العبري عادةً يحذفه.

يمكنك أيضًا دمج اللغات والتقاويم لعرض التواريخ بلغة واحدة باستخدام تقويم ثقافة أخرى.

const date = new Date('2024-10-15');

const englishIslamic = new Intl.DateTimeFormat('en-US', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(englishIslamic.format(date));
// "Rabi' II 12, 1446 AH"

const arabicIslamic = new Intl.DateTimeFormat('ar-SA', {
  calendar: 'islamic',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(arabicIslamic.format(date));
// "١٢ ربيع الآخر ١٤٤٦ هـ"

يستخدم كلا المنسقين التقويم الإسلامي، لكن اللغة الإنجليزية تنتج أسماء أشهر إنجليزية وأرقامًا لاتينية بينما تنتج اللغة العربية أسماء أشهر عربية وأرقامًا هندية عربية.

عرض السنوات عبر تقاويم متعددة

غالبًا ما تحتاج التطبيقات التي تخدم جمهورًا دوليًا إلى عرض نفس التاريخ في أنظمة تقويم متعددة. يمكنك إنشاء منسقات متعددة لإظهار تمثيلات متوازية.

const date = new Date('2024-10-15');

const calendars = [
  { name: 'Gregorian', calendar: 'gregory' },
  { name: 'Islamic', calendar: 'islamic' },
  { name: 'Hebrew', calendar: 'hebrew' },
  { name: 'Persian', calendar: 'persian' }
];

calendars.forEach(cal => {
  const formatter = new Intl.DateTimeFormat('en-US', {
    calendar: cal.calendar,
    year: 'numeric',
    month: 'long',
    day: 'numeric'
  });
  console.log(`${cal.name}: ${formatter.format(date)}`);
});

ينتج هذا:

Gregorian: October 15, 2024
Islamic: Rabi' II 12, 1446 AH
Hebrew: Tishrei 13, 5785
Persian: Mehr 24, 1403 AP

يمثل كل تقويم نفس اللحظة الزمنية باستخدام نظام عد السنوات الخاص به ومؤشرات الحقبة.

حالات الاستخدام الشائعة

تحتاج التطبيقات الدولية إلى عرض التواريخ في أنظمة التقويم التي يتوقعها المستخدمون. يعرض تطبيق مصرفي إسلامي تواريخ المعاملات باستخدام التقويم الإسلامي.

const transactionDate = new Date('2024-10-15');

const formatter = new Intl.DateTimeFormat('ar-SA', {
  calendar: 'islamic-umalqura',
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
});

console.log(`Transaction date: ${formatter.format(transactionDate)}`);
// "Transaction date: ١٢ ربيع الآخر ١٤٤٦ هـ"

تحدد التقاويم الدينية تواريخ الأعياد والمناسبات. يعرض تطبيق تقويم يهودي التواريخ العبرية للأعياد.

const roshHashanah2024 = new Date('2024-10-03');

const formatter = new Intl.DateTimeFormat('he-IL', {
  calendar: 'hebrew',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(`Rosh Hashanah: ${formatter.format(roshHashanah2024)}`);
// "Rosh Hashanah: א׳ בתשרי ה׳תשפ״ה"

تعرض التطبيقات التاريخية التواريخ في أنظمة التقويم المستخدمة في ذلك الوقت. يعرض تطبيق عن بلاد فارس القديمة التواريخ باستخدام التقويم الفارسي.

const historicalDate = new Date('2024-03-20');

const formatter = new Intl.DateTimeFormat('en-US', {
  calendar: 'persian',
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'long'
});

console.log(`Persian New Year: ${formatter.format(historicalDate)}`);
// "Persian New Year: Farvardin 1, 1403 Anno Persico"

الخلاصة

تحسب التقاويم غير الميلادية السنوات من نقاط بداية مختلفة وتستخدم أنظمة ترقيم مختلفة. يحسب التقويم الإسلامي من عام 622 م ويعرض حاليًا سنوات حوالي 1446. يحسب التقويم العبري من 3761 قبل الميلاد ويعرض سنوات حوالي 5785. يستخدم التقويم الصيني دورة مدتها 60 عامًا من السنوات المسماة بدلاً من الأرقام المتسلسلة.

يدعم Intl.DateTimeFormat في JavaScript أنظمة التقويم هذه من خلال خيار calendar. تتضمن القيم islamic، hebrew، chinese، persian، وغيرها. يتحكم خيار year في ما إذا كانت السنة تُعرض، ويتحكم خيار era في ما إذا كان مؤشر الحقبة يُعرض وكيف يُعرض.

التقاويم التي تستخدم سنوات مسماة توفر معلومتين من خلال formatToParts(). يحتوي الجزء yearName على اسم السنة الدورية. يحتوي الجزء relatedYear على السنة الميلادية المقابلة. يتيح ذلك للتطبيقات عرض أي من القيمتين أو كلتيهما.

تقوم اللغات المختلفة بتنسيق نفس التقويم بطرق مختلفة. يُعرض التقويم الهجري باللغة الإنجليزية بالأرقام اللاتينية وباللغة العربية بالأرقام العربية الهندية. يتكيف التنسيق تلقائياً مع اصطلاحات اللغة مع الحفاظ على نظام ترقيم السنوات الخاص بالتقويم.