Temporal की मदद से ग्लोबल इवेंट मैनेज करना

वेब की सुविधाएं: Temporal

लेगसी Date ऑब्जेक्ट का इस्तेमाल करके, अलग-अलग टाइम ज़ोन में इवेंट शेड्यूल करना काफ़ी मुश्किल होता है. खास तौर पर, डेलाइट सेविंग टाइम (डीएसटी) के दौरान, जब घंटे छोड़े या दोहराए जा सकते हैं.

Temporal एपीआई, Temporal.ZonedDateTime उपलब्ध कराता है. इससे किसी खास टाइम ज़ोन में तारीख और समय को दिखाया जा सकता है. साथ ही, डीएसटी ट्रांज़िशन को अपने-आप और अनुमानित तरीके से मैनेज किया जा सकता है.

इन्हें कैसे लागू करें

ग्लोबल इवेंट को मैनेज करने और डीएसटी की वजह से होने वाली संभावित समस्याओं को हल करने के लिए:

  1. ज़रूरी: ZonedDateTime बनाएं: टाइम ज़ोन के हिसाब से तारीख और समय का ऑब्जेक्ट बनाने के लिए, Temporal.ZonedDateTime.from() का इस्तेमाल करें.
  2. ज़रूरी: अस्पष्टता को मैनेज करना: जब समय अस्पष्ट हो या मौजूद न हो (उदाहरण के लिए, घड़ी में बदलाव के दौरान), तब व्यवहार को कंट्रोल करने के लिए disambiguation विकल्प का इस्तेमाल करें.
  3. ज़रूरी जानकारी: टाइम ज़ोन को कन्वर्ट करना: किसी दूसरी जगह के हिसाब से समय देखने के लिए, .withTimeZone() का इस्तेमाल करें.

उदाहरण: शेड्यूल करना और ओवरलैप होने वाले इवेंट का पता लगाना

// 1. Define the event time and target time zone
const date = "2025-03-09";
const time = "02:30"; // This time is skipped in New York during Spring Forward
const timeZone = "America/New_York";
const inputStr = `${date}T${time}[${timeZone}]`;

// 2. Detect conflicts using 'reject'
let hasConflict = false;
try {
  // 'reject' throws RangeError if the time is ambiguous or does not exist
  Temporal.ZonedDateTime.from(inputStr, { disambiguation: 'reject' });
} catch (e) {
  if (e instanceof RangeError) {
    hasConflict = true;
    console.log("This time falls in a DST transition gap or overlap.");
  }
}

// 3. Resolve the time safely using 'compatible' (default)
// 'compatible' will resolve to a valid time even if skipped or repeated
const hostTime = Temporal.ZonedDateTime.from(inputStr, { disambiguation: 'compatible' });
console.log(`Resolved time: ${hostTime.toString()}`);

// 4. Convert to another time zone (e.g., Tokyo)
const tokyoTime = hostTime.withTimeZone("Asia/Tokyo");
// Use toLocaleString() for user-facing display instead of manual hour/minute padding
console.log(`Tokyo time: ${tokyoTime.toLocaleString('en-US', { hour: 'numeric', minute: '2-digit' })}`);

रणनीति को लागू करने के तरीके और सबसे सही तरीके

  • किसी खास भौगोलिक जगह पर होने वाले इवेंट के लिए, Temporal.ZonedDateTime का इस्तेमाल करें. जैसे, किसी खास शहर में होने वाली मीटिंग.
  • अगर आपको डीएसटी ट्रांज़िशन के दौरान, शेड्यूल करने से जुड़ी समस्याओं का पता लगाना है और उपयोगकर्ताओं को चेतावनी देनी है, तो disambiguation: 'reject' का इस्तेमाल करें.
  • जब आपको सिस्टम से यह उम्मीद हो कि वह अपने-आप सही समय चुन ले, तो disambiguation: 'compatible' (डिफ़ॉल्ट) का इस्तेमाल करें.
  • ग्लोबल इवेंट के लिए, Temporal.PlainDateTime का इस्तेमाल न करें. ऐसा इसलिए, क्योंकि इसमें टाइम ज़ोन की जानकारी नहीं होती और यह डीएसटी में होने वाले बदलावों को ध्यान में नहीं रख सकता.
  • ओरिजनल ऑब्जेक्ट में बदलाव किए बिना, अन्य जगहों के हिसाब से समय का हिसाब लगाने के लिए, .withTimeZone() का इस्तेमाल करें. टेंपोरल ऑब्जेक्ट में बदलाव नहीं किया जा सकता.
  • उपयोगकर्ताओं को समय दिखाने के लिए, मैन्युअल तरीके से समय की गिनती करने और पैडिंग करने के बजाय, नेटिव .toLocaleString() फ़ॉर्मैटिंग (जैसे, { hour: 'numeric', minute: '2-digit' }) का इस्तेमाल करें.

फ़ॉलबैक रणनीति

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();
})();