JavaScript Date ऑब्जेक्ट, प्रोलेप्टिक ग्रेगोरियन कैलेंडर पर आधारित है. इस वजह से, उन उपयोगकर्ताओं के लिए ऐप्लिकेशन बनाना मुश्किल हो जाता है जो अन्य कैलेंडर सिस्टम का इस्तेमाल करते हैं. जैसे, इस्लामिक (चंद्र), हिब्रू (चंद्र-सौर) या चाइनीज़ (चंद्र-सौर) कैलेंडर. पहले, डेवलपर को इन सिस्टम के साथ काम करने के लिए, तीसरे पक्ष की जटिल लाइब्रेरी या मैन्युअल कैलकुलेशन पर निर्भर रहना पड़ता था.
Temporal एपीआई, कई कैलेंडर सिस्टम के लिए बेहतरीन सहायता उपलब्ध कराता है. तारीख वाले ऑब्जेक्ट के साथ कैलेंडर आइडेंटिफ़ायर को जोड़कर, Temporal अलग-अलग सांस्कृतिक संदर्भों के लिए ज़रूरी जटिल अंकगणित और फ़ॉर्मैटिंग को नेटिव तौर पर हैंडल करता है.
इन्हें कैसे लागू करें
Temporal का इस्तेमाल करके, दुनिया भर के कैलेंडर सिस्टम के साथ काम करने के लिए:
- कैलेंडर को असोसिएट करना (ज़रूरी):
Temporal.PlainDateजैसे किसी Temporal ऑब्जेक्ट को बनाते या कन्वर्ट करते समय, आपकोwithCalendar()का इस्तेमाल करके अपनी पसंद का कैलेंडर सिस्टम तय करना होगा. इससे कैलेंडर से जुड़े संवेदनशील ऑपरेशन किए जा सकेंगे. - स्थिर आइडेंटिफ़ायर का इस्तेमाल करें (चंद्र-सौर कैलेंडर के लिए ज़रूरी): आपको चंद्र-सौर कैलेंडर में अलग-अलग सालों के महीनों की पहचान करने के लिए, अंकों वाले
monthइंडेक्स के बजायmonthCodeका इस्तेमाल करना चाहिए. इसका इस्तेमाल सिर्फ़ उन कैलेंडर के लिए करें जिनमें लीप महीने होते हैं. जैसे, हिब्रू और चाइनीज़ कैलेंडर. - कैलेंडर के इनवैरिएंट का सम्मान करें (ज़रूरी): महीनों या दिनों को दोहराते समय, आपको तय वैल्यू नहीं माननी चाहिए. जैसे, एक साल में 12 महीने या एक महीने में 31 दिन.
monthsInYearऔरdaysInMonthजैसी प्रॉपर्टी का इस्तेमाल करें, ताकि यह पक्का किया जा सके कि आपका कोड सभी कैलेंडर पर काम करे. - कैलेंडर के हिसाब से तुलना करने की सुविधा का इस्तेमाल करें (ज़रूरी): किसी खास कैलेंडर सिस्टम में तारीखों की तुलना करते समय, साल/महीने/दिन की प्रॉपर्टी की मैन्युअल तरीके से तुलना करने के बजाय,
Temporal.PlainDate.compare()का इस्तेमाल करें. इससे कैलेंडर के नियमों के तहत, समय के हिसाब से सही क्रम में लगाने की सुविधा सही तरीके से काम करती है.
कोड का उदाहरण: कैलेंडर को बदलना और उन्हें दोहराना
// 1. Helper to check calendar support
function isCalendarSupported(calendarId) {
try {
return Intl.supportedValuesOf('calendar').includes(calendarId);
} catch {
// Fallback for environments where supportedValuesOf is not available
return false;
}
}
// 2. Get current date in default ISO 8601 calendar
const isoDate = Temporal.Now.plainDateISO();
// 3. Convert to Hebrew calendar if supported
const calendarId = 'hebrew';
const targetDate = isCalendarSupported(calendarId)
? isoDate.withCalendar(calendarId)
: isoDate; // Fallback to ISO if not supported
if (targetDate.calendar.id !== calendarId) {
console.warn(`Calendar ${calendarId} not supported; falling back to ISO 8601`);
}
// 4. Log properties specific to the calendar
console.log(`Calendar: ${targetDate.calendar.id}`);
console.log(`Year: ${targetDate.year}`);
console.log(`Month Code: ${targetDate.monthCode}`); // Stable across leap years
// 5. Safely iterate through months in the current year
for (let m = 1; m <= targetDate.monthsInYear; m++) {
console.log(`Month ${m} has ${targetDate.with({ month: m }).daysInMonth} days.`);
}
// 6. Compare dates within the same calendar
const today = Temporal.Now.plainDateISO().withCalendar(calendarId);
const comparison = Temporal.PlainDate.compare(targetDate, today);
const relative = comparison < 0 ? 'Past' : comparison > 0 ? 'Future' : 'Today';
console.log(`Timeline: ${relative}`);
// 7. Format for display using toLocaleString (including era for era-based calendars like 'japanese')
const localizedDisplay = targetDate.toLocaleString('en-u-ca-hebrew', {
day: 'numeric',
month: 'long',
year: 'numeric',
era: 'long'
});
रणनीति को लागू करने के तरीके और सबसे सही तरीके
- महीनों को लूप करते समय, 12 मानने के बजाय
monthsInYearको ऊपरी सीमा के तौर पर इस्तेमाल करें. - ज़रूर इस्तेमाल करें
monthCode, ताकि लीप महीने वाले कैलेंडर (जैसे, हिब्रू या चाइनीज़) में खास महीनों की पहचान की जा सके. इससे कोई फ़र्क़ नहीं पड़ता कि साल कौन सा है. - यह न मानें कि
date.month === 12साल का आखिरी महीना है.date.month === date.monthsInYearका इस्तेमाल करें. - यह न मानें कि
inLeapYear === trueका मतलब है कि साल में सिर्फ़ एक दिन ज़्यादा होता है. लूनिसोलर कैलेंडर में, यह पूरा लीप महीना जोड़ सकता है. - किसी खास कैलेंडर सिस्टम में दो तारीखों की तुलना करते समय, साल/महीने/दिन की प्रॉपर्टी की मैन्युअल तरीके से तुलना करने के बजाय,
Temporal.PlainDate.compare()का इस्तेमाल करें. - उपयोगकर्ताओं के लिए तारीखों को फ़ॉर्मैट करने के लिए, मैन्युअल तरीके से स्ट्रिंग जोड़ने की प्रोसेस के बजाय
toLocaleString()का इस्तेमाल करें. - कैलेंडर के हिसाब से Temporal ऑब्जेक्ट बनाने से पहले,
Intl.supportedValuesOf('calendar')का इस्तेमाल करके यह पुष्टि ज़रूर करें कि टारगेट किया गया कैलेंडर सिस्टम, एनवायरमेंट के साथ काम करता हो. - ध्यान रखें कि कुछ कैलेंडर (जैसे, इस्लामिक कैलेंडर के वैरिएंट), तय की गई गणनाओं के बजाय विज़ुअल ऑब्ज़र्वेशन पर आधारित हो सकते हैं.
Temporalएपीआई, एनवायरमेंट केIntlको लागू करने के तरीके का पालन करता है. आम तौर पर, इसमें अनुमानित वैल्यू का इस्तेमाल किया जाता है. किसी अहम सांस्कृतिक या धार्मिक तारीख का हिसाब लगाने के लिए, डोमेन के विशेषज्ञों से पुष्टि करें या खास लाइब्रेरी का इस्तेमाल करें. - DO:
toLocaleString()का इस्तेमाल करके, युगों (जैसे, जापानी, बौद्ध) का इस्तेमाल करने वाले कैलेंडर का इस्तेमाल करते समय, युग के नामों को शामिल करें.
फ़ॉलबैक रणनीति
Temporal के लिए फ़ॉलबैक और ब्राउज़र की सुविधा
ऐसे ब्राउज़र जो अब तक नेटिव Temporal एपीआई के साथ काम नहीं करते हैं उनके लिए, सुविधा की पहचान करने वाले टूल का इस्तेमाल करें और temporal-polyfill (~15 केबी min+gz) को डाइनैमिक तौर पर लोड करें.
ध्यान दें कि temporal-polyfill को इंपोर्ट करने से, Temporal ऑब्जेक्ट अपने-आप ग्लोबल स्कोप को असाइन नहीं होता. अगर आपका कोड globalThis.Temporal पर निर्भर करता है, तो इसे साफ़ तौर पर असाइन करें.
// Check if Temporal is supported natively
(async () => {
if (typeof Temporal === 'undefined') {
// Load the polyfill conditionally
const module = await import('https://esm.sh/temporal-polyfill');
globalThis.Temporal = module.Temporal;
// Extend Date.prototype if needed
Date.prototype.toTemporalInstant = module.toTemporalInstant;
}
initializeApp();
})();