বাংলা

জাভাস্ক্রিপ্ট টেম্পোরাল এপিআই-এর একটি বিশদ নির্দেশিকা, যা বিভিন্ন আন্তর্জাতিক প্রেক্ষাপটে কার্যকরভাবে তারিখ ও সময় পরিচালনার জন্য একটি আধুনিক সমাধান।

জাভাস্ক্রিপ্ট টেম্পোরাল এপিআই: বিশ্বব্যাপী দর্শকদের জন্য আধুনিক তারিখ ও সময় ব্যবস্থাপনা

জাভাস্ক্রিপ্টের `Date` অবজেক্টটি ডেভেলপারদের জন্য দীর্ঘদিন ধরেই একটি বিরক্তির কারণ। এর পরিবর্তনশীলতা (mutability), অসামঞ্জস্যপূর্ণ এপিআই, এবং দুর্বল টাইমজোন সমর্থন Moment.js এবং date-fns-এর মতো অনেক লাইব্রেরির জন্ম দিয়েছে এই ঘাটতিগুলো পূরণ করার জন্য। এখন, টেম্পোরাল এপিআই-এর মাধ্যমে, জাভাস্ক্রিপ্ট তারিখ এবং সময় পরিচালনার জন্য একটি আধুনিক, বিল্ট-ইন সমাধান প্রদান করে যা আরও স্পষ্টতা এবং নির্ভুলতা নিশ্চিত করে। এই নিবন্ধটি টেম্পোরাল এপিআই-এর একটি ব্যাপক পর্যালোচনা প্রদান করে, যেখানে এর বৈশিষ্ট্য, সুবিধা এবং বিভিন্ন আন্তর্জাতিক প্রেক্ষাপটে এর ব্যবহারের উপর আলোকপাত করা হয়েছে।

টেম্পোরাল এপিআই কী?

টেম্পোরাল এপিআই হলো জাভাস্ক্রিপ্টে একটি নতুন, গ্লোবাল অবজেক্ট যা `Date` অবজেক্টের ত্রুটিগুলো সমাধান করার জন্য ডিজাইন করা হয়েছে। এটি তারিখ, সময়, টাইমজোন এবং ক্যালেন্ডার সিস্টেমের সাথে কাজ করার জন্য একটি পরিষ্কার, অপরিবর্তনীয় (immutable) এপিআই প্রদান করে। সবচেয়ে গুরুত্বপূর্ণ হলো, এটি তারিখ এবং সময়ের ধারণাগুলোকে এমনভাবে উপস্থাপন করে যা বাস্তব জীবনের ব্যবহার এবং প্রত্যাশার সাথে আরও বেশি সামঞ্জস্যপূর্ণ, যা আন্তর্জাতিকীকরণকে (internationalization) অনেক সহজ করে তোলে।

মূল বৈশিষ্ট্য:

মৌলিক টেম্পোরাল অবজেক্ট

টেম্পোরাল এপিআই বেশ কিছু নতুন অবজেক্টের ধরণ নিয়ে এসেছে। এখানে কিছু মূল অবজেক্ট তুলে ধরা হলো:

তারিখ নিয়ে কাজ করা

`Temporal.PlainDate` তৈরি করা

একটি `Temporal.PlainDate` তৈরি করতে, আপনি কনস্ট্রাক্টর ব্যবহার করতে পারেন:

const plainDate = new Temporal.PlainDate(2024, 10, 27); // বছর, মাস (১-১২), দিন
console.log(plainDate.toString()); // আউটপুট: 2024-10-27

আপনি `from` মেথডটিও ব্যবহার করতে পারেন, যা ISO 8601 ফরম্যাটে একটি স্ট্রিং গ্রহণ করে:

const plainDateFromString = Temporal.PlainDate.from('2024-10-27');
console.log(plainDateFromString.toString()); // আউটপুট: 2024-10-27

তারিখের উপাদানগুলো পাওয়া

আপনি `year`, `month`, এবং `day`-এর মতো প্রপার্টি ব্যবহার করে তারিখের স্বতন্ত্র উপাদানগুলো অ্যাক্সেস করতে পারেন:

console.log(plainDate.year); // আউটপুট: 2024
console.log(plainDate.month); // আউটপুট: 10
console.log(plainDate.day); // আউটপুট: 27

তারিখের গণনা

দিন, সপ্তাহ, মাস বা বছর যোগ বা বিয়োগ করতে, `plus` এবং `minus` মেথড ব্যবহার করুন। এই মেথডগুলো একটি নতুন `Temporal.PlainDate` অবজেক্ট প্রদান করে:

const nextWeek = plainDate.plus({ days: 7 });
console.log(nextWeek.toString()); // আউটপুট: 2024-11-03

const lastMonth = plainDate.minus({ months: 1 });
console.log(lastMonth.toString()); // আউটপুট: 2024-09-27

তারিখের তুলনা করা

আপনি `compare` মেথড ব্যবহার করে তারিখের তুলনা করতে পারেন:

const date1 = new Temporal.PlainDate(2024, 10, 27);
const date2 = new Temporal.PlainDate(2024, 11, 15);

console.log(Temporal.PlainDate.compare(date1, date2)); // আউটপুট: -1 (date1, date2-এর আগের তারিখ)

সময় নিয়ে কাজ করা

`Temporal.PlainTime` তৈরি করা

একটি `Temporal.PlainTime` তৈরি করতে, কনস্ট্রাক্টর ব্যবহার করুন:

const plainTime = new Temporal.PlainTime(10, 30, 0); // ঘন্টা, মিনিট, সেকেন্ড
console.log(plainTime.toString()); // আউটপুট: 10:30:00

অথবা ISO 8601 টাইম স্ট্রিং সহ `from` মেথড ব্যবহার করুন:

const plainTimeFromString = Temporal.PlainTime.from('10:30:00');
console.log(plainTimeFromString.toString()); // আউটপুট: 10:30:00

সময়ের উপাদানগুলো পাওয়া

console.log(plainTime.hour); // আউটপুট: 10
console.log(plainTime.minute); // আউটপুট: 30
console.log(plainTime.second); // আউটপুট: 0

সময়ের গণনা

const later = plainTime.plus({ minutes: 15 });
console.log(later.toString()); // আউটপুট: 10:45:00

তারিখ এবং সময় একসাথে নিয়ে কাজ করা

`Temporal.PlainDateTime` তৈরি করা

আপনি সরাসরি `Temporal.PlainDateTime` তৈরি করতে পারেন অথবা একটি `Temporal.PlainDate` এবং `Temporal.PlainTime` একত্রিত করে তৈরি করতে পারেন:

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
console.log(plainDateTime.toString()); // আউটপুট: 2024-10-27T10:30:00

const date = new Temporal.PlainDate(2024, 10, 27);
const time = new Temporal.PlainTime(10, 30, 0);
const combinedDateTime = date.toPlainDateTime(time);
console.log(combinedDateTime.toString()); // আউটপুট: 2024-10-27T10:30:00

টাইমজোন

বিভিন্ন অবস্থানে থাকা ব্যবহারকারীদের সাথে কাজ করা অ্যাপ্লিকেশনগুলোর জন্য টাইমজোন সঠিকভাবে পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ। টেম্পোরাল এপিআই `Temporal.ZonedDateTime` এবং `Temporal.TimeZone` অবজেক্টের মাধ্যমে শক্তিশালী টাইমজোন সমর্থন প্রদান করে।

`Temporal.ZonedDateTime` তৈরি করা

একটি `Temporal.ZonedDateTime` তৈরি করতে, আপনার একটি `Temporal.PlainDateTime` এবং একটি টাইমজোন আইডেন্টিফায়ার প্রয়োজন। টাইমজোন আইডেন্টিফায়ারগুলো IANA টাইমজোন ডাটাবেসের উপর ভিত্তি করে তৈরি (যেমন, `America/Los_Angeles`, `Europe/London`, `Asia/Tokyo`)।

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);
console.log(zonedDateTime.toString()); // আউটপুট: 2024-10-27T10:30:00-07:00[America/Los_Angeles] (অফসেটটি DST নিয়মের উপর নির্ভর করবে)

বিকল্পভাবে, একটি `Instant` থেকে `Temporal.ZonedDateTime` তৈরি করুন।

const instant = Temporal.Instant.fromEpochSeconds(1666866600); // উদাহরণ টাইমস্ট্যাম্প
const zonedDateTimeFromInstant = instant.toZonedDateTimeISO(timeZone); // 'America/Los_Angeles'-এর মতো টাইমজোন
console.log(zonedDateTimeFromInstant.toString());

টাইমজোনের মধ্যে রূপান্তর

আপনি `withTimeZone` মেথড ব্যবহার করে একটি `Temporal.ZonedDateTime`-কে অন্য টাইমজোনে রূপান্তর করতে পারেন:

const newTimeZone = 'Europe/London';
const zonedDateTimeInLondon = zonedDateTime.withTimeZone(newTimeZone);
console.log(zonedDateTimeInLondon.toString()); // আউটপুট: 2024-10-27T18:30:00+01:00[Europe/London]

টাইমজোন অফসেট নিয়ে কাজ করা

`Temporal.TimeZone` অবজেক্টের `getOffsetStringFor` মেথড একটি নির্দিষ্ট `Temporal.Instant`-এর জন্য অফসেট স্ট্রিং প্রদান করে:

const timeZoneObject = new Temporal.TimeZone(timeZone);
const offsetString = timeZoneObject.getOffsetStringFor(zonedDateTime.toInstant());
console.log(offsetString); // আউটপুট: -07:00 (DST নিয়মের উপর নির্ভর করে)

সঠিক গণনার জন্য সঠিক IANA টাইমজোন আইডেন্টিফায়ার ব্যবহার করা অপরিহার্য। ডেলাইট সেভিং টাইম এবং টাইমজোন সীমানার পরিবর্তনগুলো প্রতিফলিত করতে এই আইডেন্টিফায়ারগুলো নিয়মিত রক্ষণাবেক্ষণ এবং আপডেট করা হয়।

সময়কাল (Durations)

`Temporal.Duration` অবজেক্ট একটি সময়ের ব্যাপ্তি উপস্থাপন করে। এটি তারিখ এবং সময় থেকে যোগ বা বিয়োগ করতে ব্যবহার করা যেতে পারে।

`Temporal.Duration` তৈরি করা

আপনি কনস্ট্রাক্টর ব্যবহার করে একটি `Temporal.Duration` তৈরি করতে পারেন, যেখানে বছর, মাস, দিন, ঘন্টা, মিনিট, সেকেন্ড, মিলিসেকেন্ড, মাইক্রোসেকেন্ড এবং ন্যানোসেকেন্ড উল্লেখ করতে পারেন:

const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9); // বছর, মাস, দিন, ঘন্টা, মিনিট, সেকেন্ড, মিলিসেকেন্ড, মাইক্রোসেকেন্ড, ন্যানোসেকেন্ড
console.log(duration.toString()); // আউটপুট: P1Y2M3DT4H5M6.007008009S

অথবা একটি ISO 8601 ডিউরেশন স্ট্রিং ব্যবহার করে:

const durationFromString = Temporal.Duration.from('P1Y2M3DT4H5M6S');
console.log(durationFromString.toString()); // আউটপুট: P1Y2M3DT4H5M6S

তারিখ এবং সময়ে সময়কাল যোগ করা

const plainDate = new Temporal.PlainDate(2024, 10, 27);
const duration = new Temporal.Duration(0, 0, 7); // ৭ দিন
const newDate = plainDate.plus(duration);
console.log(newDate.toString()); // আউটপুট: 2024-11-03

লক্ষ্য করুন যে তারিখের সাথে মাস বা বছর জড়িত সময়কাল যোগ করার জন্য সতর্কতার প্রয়োজন, কারণ একটি মাস বা বছরের দিনের সংখ্যা পরিবর্তিত হতে পারে।

ক্যালেন্ডার সিস্টেম

টেম্পোরাল এপিআই গ্রেগরিয়ান ক্যালেন্ডারের বাইরেও বিভিন্ন ক্যালেন্ডার সিস্টেম সমর্থন করে। এটি সেই অ্যাপ্লিকেশনগুলোর জন্য অত্যন্ত গুরুত্বপূর্ণ যেগুলোকে বিভিন্ন সাংস্কৃতিক প্রেক্ষাপটে তারিখ পরিচালনা করতে হয়। যদিও সমর্থন এখনো বিকশিত হচ্ছে, এটি ভবিষ্যতের সম্প্রসারণের জন্য একটি ভিত্তি প্রদান করে।

বিকল্প ক্যালেন্ডার ব্যবহার করা

একটি নির্দিষ্ট ক্যালেন্ডার ব্যবহার করতে, আপনি টেম্পোরাল অবজেক্ট তৈরি করার সময় তা উল্লেখ করতে পারেন:

const hebrewDate = new Temporal.PlainDate(5785, 1, 1, { calendar: 'hebrew' });
console.log(hebrewDate.toString()); // নির্দিষ্ট আউটপুট ইমপ্লিমেন্টেশন এবং ফরম্যাটিংয়ের উপর নির্ভর করে পরিবর্তিত হতে পারে। এটি লেখার সময় অনেক এনভায়রনমেন্টে পলিফিল প্রয়োজন।

গুরুত্বপূর্ণ: অ-গ্রেগরিয়ান ক্যালেন্ডারের সমর্থনের জন্য পলিফিল বা নির্দিষ্ট ব্রাউজার/এনভায়রনমেন্টের সমর্থনের প্রয়োজন হতে পারে। সর্বশেষ তথ্যের জন্য টেম্পোরাল এপিআই ডকুমেন্টেশন এবং ব্রাউজার সামঞ্জস্যতা টেবিল দেখুন।

তারিখ এবং সময় ফরম্যাট করা

যদিও টেম্পোরাল এপিআই তারিখ এবং সময় ম্যানিপুলেশনের উপর দৃষ্টি নিবদ্ধ করে, ফরম্যাটিং সাধারণত `Intl.DateTimeFormat` অবজেক্ট দ্বারা পরিচালিত হয়, যা Internationalization API-এর একটি অংশ। টেম্পোরাল অবজেক্টগুলো `Intl.DateTimeFormat`-এর সাথে নির্বিঘ্নে কাজ করে।

`Intl.DateTimeFormat` ব্যবহার করা

এখানে `Intl.DateTimeFormat` ব্যবহার করে একটি `Temporal.PlainDate` ফরম্যাট করার পদ্ধতি দেখানো হলো:

const plainDate = new Temporal.PlainDate(2024, 10, 27);
const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatter.format(plainDate)); // আউটপুট: October 27, 2024

const formatterGerman = new Intl.DateTimeFormat('de-DE', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatterGerman.format(plainDate)); // আউটপুট: 27. Oktober 2024

আপনি আপনার প্রয়োজন অনুযায়ী ফরম্যাট অপশনগুলো কাস্টমাইজ করতে পারেন। `Intl.DateTimeFormat`-এর প্রথম আর্গুমেন্ট হলো লোকেল (locale), যা ফরম্যাটিংয়ের জন্য ব্যবহৃত ভাষা এবং আঞ্চলিক নিয়ম নির্ধারণ করে। বিভিন্ন লোকেল (যেমন, 'en-US', 'de-DE', 'fr-FR', 'ja-JP') ব্যবহার করলে বিভিন্ন আউটপুট ফরম্যাট তৈরি হয়।

`Temporal.ZonedDateTime` ফরম্যাট করা

`Temporal.ZonedDateTime` ফরম্যাট করা একই রকম, তবে আপনি আউটপুটে টাইমজোনের তথ্যও অন্তর্ভুক্ত করতে পারেন:

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);

const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', timeZoneName: 'short' });
console.log(formatter.format(zonedDateTime)); // আউটপুট: October 27, 2024, 10:30 AM PDT (টাইমজোন সংক্ষিপ্তরূপ DST নিয়মের উপর নির্ভর করে)

আন্তর্জাতিকীকরণের সেরা অনুশীলন

বিশ্বব্যাপী প্রেক্ষাপটে তারিখ এবং সময় নিয়ে কাজ করার সময়, নিম্নলিখিত সেরা অনুশীলনগুলো মনে রাখবেন:

টেম্পোরাল এপিআই এবং পুরনো Date অবজেক্টের তুলনা

এখানে একটি টেবিল রয়েছে যা পুরনো `Date` অবজেক্টের তুলনায় টেম্পোরাল এপিআই-এর মূল পার্থক্য এবং সুবিধাগুলো তুলে ধরে:

বৈশিষ্ট্য পুরনো `Date` অবজেক্ট টেম্পোরাল এপিআই
পরিবর্তনশীলতা (Mutability) পরিবর্তনশীল (মূল অবজেক্ট পরিবর্তন করে) অপরিবর্তনীয় (নতুন অবজেক্ট প্রদান করে)
টাইমজোন সমর্থন সীমিত এবং প্রায়শই সমস্যাযুক্ত শক্তিশালী এবং সঠিক, IANA টাইমজোন ডাটাবেসের উপর ভিত্তি করে
এপিআই অসামঞ্জস্যপূর্ণ এবং ব্যবহারে কঠিন পরিষ্কার, সামঞ্জস্যপূর্ণ এবং স্বজ্ঞাত
নির্ভুলতা (Precision) মিলিসেকেন্ড ন্যানোসেকেন্ড
ক্যালেন্ডার সিস্টেম গ্রেগরিয়ানে সীমাবদ্ধ বিকল্প ক্যালেন্ডার সিস্টেম সমর্থন করে (ক্রমবর্ধমান সমর্থন সহ)
আন্তর্জাতিকীকরণ শক্তিশালী আন্তর্জাতিকীকরণের জন্য বাহ্যিক লাইব্রেরির প্রয়োজন হয় বিল্ট-ইন সমর্থন এবং `Intl.DateTimeFormat`-এর সাথে নির্বিঘ্ন ইন্টিগ্রেশন

ব্রাউজার সমর্থন এবং পলিফিল

একটি তুলনামূলকভাবে নতুন এপিআই হওয়ায়, টেম্পোরাল এপিআই-এর জন্য ব্রাউজার সমর্থন এখনো বিকশিত হচ্ছে। কোন ব্রাউজার এবং এনভায়রনমেন্টে এটি নেটিভভাবে সমর্থিত তা দেখতে সর্বশেষ ব্রাউজার সামঞ্জস্যতা টেবিলগুলো (যেমন, MDN ওয়েব ডক্সে) দেখুন। পুরনো ব্রাউজার বা নেটিভ সমর্থন ছাড়া এনভায়রনমেন্টের জন্য, আপনি টেম্পোরাল এপিআই কার্যকারিতা সরবরাহ করতে পলিফিল ব্যবহার করতে পারেন। উপযুক্ত বিকল্পগুলো খুঁজে পেতে ওয়েবে "Temporal API polyfill" অনুসন্ধান করুন।

উপসংহার

জাভাস্ক্রিপ্ট টেম্পোরাল এপিআই জাভাস্ক্রিপ্টে তারিখ এবং সময় পরিচালনার ক্ষেত্রে একটি গুরুত্বপূর্ণ পদক্ষেপ। এর অপরিবর্তনীয়তা, পরিষ্কার এপিআই, শক্তিশালী টাইমজোন সমর্থন এবং ক্যালেন্ডার সিস্টেমের ক্ষমতা এটিকে ডেভেলপারদের জন্য একটি শক্তিশালী টুল করে তুলেছে যারা বিভিন্ন আন্তর্জাতিক প্রেক্ষাপটে নির্ভুল এবং নির্ভরযোগ্যভাবে তারিখ ও সময়ের সাথে কাজ করার জন্য অ্যাপ্লিকেশন তৈরি করে। যদিও ব্রাউজার সমর্থন এখনো বিকশিত হচ্ছে, টেম্পোরাল এপিআই-এর সুবিধাগুলো এটিকে নতুন প্রকল্পগুলোর জন্য শেখা এবং গ্রহণ করার যোগ্য করে তুলেছে। টেম্পোরাল এপিআই গ্রহণ করে এবং আন্তর্জাতিকীকরণের সেরা অনুশীলনগুলো অনুসরণ করে, আপনি এমন অ্যাপ্লিকেশন তৈরি করতে পারেন যা বিশ্বজুড়ে ব্যবহারকারীদের জন্য একটি নির্বিঘ্ন এবং সঠিক তারিখ ও সময়ের অভিজ্ঞতা প্রদান করে।

আরও জানুন