টেম্পোরালের সাথে গ্লোবাল ইভেন্ট কোঅর্ডিনেট করা

ওয়েব ফিচার: Temporal

পুরনো Date অবজেক্টের মাধ্যমে বিভিন্ন টাইম জোনে ইভেন্ট শিডিউল করা খুবই কঠিন, বিশেষ করে ডেলাইট সেভিং টাইম (DST) ট্রানজিশনের সময় যখন ঘণ্টা বাদ দেওয়া বা রিপিট করা হতে পারে।

Temporal API, Temporal.ZonedDateTime প্রদান করে যা নির্দিষ্ট টাইম জোনে তারিখ ও সময় দেখায় এবং DST ট্রানজিশন অটোমেটিক ও অনুমানযোগ্যভাবে ম্যানেজ করে।

কীভাবে প্রয়োগ করতে হয়

গ্লোবাল ইভেন্ট কোঅর্ডিনেট করতে এবং সম্ভাব্য DST সংক্রান্ত দ্বন্দ্ব ম্যানেজ করতে:

  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 ব্যবহার করবেন না, কারণ এতে টাইম জোন সংক্রান্ত তথ্য থাকে না এবং DST পরিবর্তন হিসেব করতে পারে না।
  • অরিজিনাল অবজেক্ট পরিবর্তন না করে অন্যান্য লোকেশনে সমতুল্য সময় গণনা করতে .withTimeZone() ব্যবহার করুন (টেম্পোরাল অবজেক্ট পরিবর্তন করা যায় না)।
  • ব্যবহারকারী নিজে ইন্টার‌্যাক্ট করতে পারেন এমন সময় দেখানোর জন্য ম্যানুয়াল সময় গণনা ও প্যাডিংয়ের পরিবর্তে নেটিভ .toLocaleString() ফর্ম্যাটিং (যেমন { hour: 'numeric', minute: '2-digit' }) ব্যবহার করুন।

ফলব্যাক স্ট্র্যাটেজি

টেম্পোরালের জন্য ফলব্যাক ও ব্রাউজার সহায়তা

যেসব ব্রাউজার এখনও নেটিভ Temporal API সাপোর্ট করে না, সেগুলির জন্য ফিচার শনাক্তকরণ ব্যবহার করুন এবং ডায়নামিকভাবে temporal-polyfill (~15 KB 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();
})();