বাংলা

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

জাভাস্ক্রিপ্ট টেম্পোরাল ডিউরেশন: সময় ব্যবধানের গণনা আয়ত্ত করা

জাভাস্ক্রিপ্টের টেম্পোরাল এপিআই তারিখ, সময় এবং সময় ব্যবধান পরিচালনার জন্য একটি আধুনিক এবং শক্তিশালী উপায় प्रस्तुत করে। Temporal.Duration অবজেক্টটি একটি নির্দিষ্ট সময়ের দৈর্ঘ্যকে প্রতিনিধিত্ব করে, যা সময়ের ব্যবধান নিয়ে গণনা করার জন্য একটি স্পষ্ট এবং স্বজ্ঞাত পদ্ধতি প্রদান করে। এই নিবন্ধটি Temporal.Duration এর বিস্তারিত আলোচনা করে, যেখানে বিভিন্ন ব্যবহারের জন্য ডিউরেশন তৈরি, পরিবর্তন এবং ফরম্যাট করার পদ্ধতি দেখানো হয়েছে।

টেম্পোরাল.ডিউরেশন কী?

Temporal.Duration একটি সময়কালকে প্রতিনিধিত্ব করে, যা বছর, মাস, দিন, ঘণ্টা, মিনিট, সেকেন্ড এবং সেকেন্ডের ভগ্নাংশে (মিলিসেকেন্ড, মাইক্রোসেকেন্ড, ন্যানোসেকেন্ড) প্রকাশ করা হয়। Date অবজেক্ট যা একটি নির্দিষ্ট সময়বিন্দুকে বোঝায়, তার বিপরীতে Temporal.Duration একটি সময়ের পরিমাণকে বোঝায়। এটি ISO 8601 ডিউরেশন ফরম্যাট অনুসরণ করে (উদাহরণস্বরূপ, P1Y2M10DT2H30M ১ বছর, ২ মাস, ১০ দিন, ২ ঘণ্টা এবং ৩০ মিনিট বোঝায়)। টেম্পোরাল এপিআইটি পুরোনো Date অবজেক্টের চেয়ে বেশি স্বজ্ঞাত এবং কম ত্রুটিপূর্ণ হওয়ার জন্য ডিজাইন করা হয়েছে।

টেম্পোরাল.ডিউরেশন অবজেক্ট তৈরি করা

Temporal.Duration অবজেক্ট তৈরি করার বিভিন্ন উপায় আছে:

১. একটি প্লেইন অবজেক্ট থেকে

আপনি কাঙ্ক্ষিত বৈশিষ্ট্য সহ একটি অবজেক্ট পাস করে ডিউরেশন তৈরি করতে পারেন:

const duration = new Temporal.Duration(1, 2, 10, 2, 30, 0, 0, 0);
console.log(duration.toString()); // Output: P1Y2M10DT2H30M

এটি ১ বছর, ২ মাস, ১০ দিন, ২ ঘণ্টা এবং ৩০ মিনিটের একটি ডিউরেশন তৈরি করে। লক্ষ্য করুন যে আর্গুমেন্টগুলি নিম্নলিখিত ক্রমে মিলে যায়: years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds

২. একটি ISO 8601 স্ট্রিং থেকে

আপনি Temporal.Duration.from() ব্যবহার করে একটি ISO 8601 ডিউরেশন স্ট্রিং থেকেও ডিউরেশন তৈরি করতে পারেন:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.toString()); // Output: P1Y2M10DT2H30M

স্ট্রিং ফরম্যাটে সংরক্ষিত বা কোনো বাহ্যিক উৎস থেকে প্রাপ্ত ডিউরেশন নিয়ে কাজ করার সময় এটি বিশেষভাবে কার্যকর।

৩. Temporal.Instant, Temporal.ZonedDateTime ইত্যাদির সাথে add() এবং subtract() মেথড ব্যবহার করে

যখন আপনি অন্যান্য টেম্পোরাল টাইপ (যেমন Temporal.Instant বা Temporal.ZonedDateTime) থেকে Temporal.Duration যোগ বা বিয়োগ করেন, তখন সময়ের দুটি বিন্দুর মধ্যে পার্থক্যটি একটি Temporal.Duration হিসেবে ফিরে আসে। উদাহরণস্বরূপ:

const now = Temporal.Now.zonedDateTimeISO();
const later = now.add({ hours: 5 });
const duration = later.since(now);
console.log(duration.toString()); // Output: PT5H

ডিউরেশন কম্পোনেন্ট অ্যাক্সেস করা

আপনি একটি Temporal.Duration অবজেক্টের বৈশিষ্ট্যগুলি ব্যবহার করে তার পৃথক কম্পোনেন্টগুলি অ্যাক্সেস করতে পারেন:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.years);      // Output: 1
console.log(duration.months);     // Output: 2
console.log(duration.days);       // Output: 10
console.log(duration.hours);      // Output: 2
console.log(duration.minutes);     // Output: 30
console.log(duration.seconds);     // Output: 0
console.log(duration.milliseconds); // Output: 0
console.log(duration.microseconds); // Output: 0
console.log(duration.nanoseconds);  // Output: 0

ডিউরেশন দিয়ে গাণিতিক কাজ করা

Temporal.Duration অবজেক্টগুলি add() এবং subtract() মেথড ব্যবহার করে যোগ এবং বিয়োগ সমর্থন করে। এই মেথডগুলি অপারেশনের ফলাফল হিসাবে একটি নতুন Temporal.Duration অবজেক্ট প্রদান করে।

const duration1 = Temporal.Duration.from("P1Y2M");
const duration2 = Temporal.Duration.from("P3M4D");

const addedDuration = duration1.add(duration2);
console.log(addedDuration.toString()); // Output: P1Y5M4D

const subtractedDuration = duration1.subtract(duration2);
console.log(subtractedDuration.toString()); // Output: P10M26D

আপনি আরও জটিল গণনার জন্য এই মেথডগুলিকে চেইন করতে পারেন:

const duration = Temporal.Duration.from("P1D").add({ hours: 12 }).subtract({ minutes: 30 });
console.log(duration.toString()); // Output: P1DT11H30M

negated() মেথড একটি নতুন Temporal.Duration অবজেক্ট প্রদান করে যার সমস্ত কম্পোনেন্ট ঋণাত্মক করা হয়:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const negatedDuration = duration.negated();
console.log(negatedDuration.toString()); // Output: -P1Y2M10DT2H30M

abs() মেথড একটি নতুন Temporal.Duration অবজেক্ট প্রদান করে যার সমস্ত কম্পোনেন্ট ধনাত্মক মান (পরম মান) হিসাবে থাকে:

const duration = Temporal.Duration.from("-P1Y2M10DT2H30M");
const absoluteDuration = duration.abs();
console.log(absoluteDuration.toString()); // Output: P1Y2M10DT2H30M

with() মেথড আপনাকে একটি নতুন Temporal.Duration ইনস্ট্যান্স তৈরি করার সুযোগ দেয় যেখানে কিছু বা সমস্ত বৈশিষ্ট্য নতুন মান দিয়ে পরিবর্তন করা হয়। যদি আর্গুমেন্ট অবজেক্টে কোনো মান উল্লেখ না করা হয়, তাহলে ডিউরেশনের মূল মান ব্যবহার করা হবে। উদাহরণস্বরূপ:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const newDuration = duration.with({ years: 2, days: 5 });
console.log(newDuration.toString()); // Output: P2Y2M5DT2H30M

ডিউরেশন স্বাভাবিকীকরণ (Normalizing)

ডিউরেশন কখনও কখনও একটি অ-স্বাভাবিক রূপে প্রকাশ করা যেতে পারে (যেমন, P1Y12M, যা P2Y তে সরল করা যেতে পারে)। normalized() মেথড একটি ডিউরেশনকে তার সবচেয়ে সংক্ষিপ্ত আকারে সরল করার চেষ্টা করে। তবে, মাসের দৈর্ঘ্যের ভিন্নতার জটিলতা সামলাতে এর জন্য একটি রেফারেন্স তারিখ প্রয়োজন। সঠিকভাবে স্বাভাবিকীকরণ করতে, আপনার একটি Temporal.PlainDate, Temporal.ZonedDateTime, বা Temporal.Instant ইনস্ট্যান্স প্রয়োজন হবে।

উদাহরণস্বরূপ, মাস এবং দিন জড়িত একটি ডিউরেশন স্বাভাবিকীকরণ করার জন্য একটি রেফারেন্স তারিখ প্রয়োজন:

const duration = Temporal.Duration.from("P1M32D");
const referenceDate = Temporal.PlainDate.from("2024-01-01");
const normalizedDuration = duration.normalized({ relativeTo: referenceDate });
console.log(normalizedDuration.toString()); // Output: P2M1D

এই উদাহরণে, ডিউরেশন P1M32D কে ১ জানুয়ারী, ২০২৪ এর সাপেক্ষে স্বাভাবিকীকরণ করা হয়েছে, যার ফলে P2M1D হয়েছে কারণ জানুয়ারী মাসে ৩১ দিন থাকে।

আপনি যদি শুধু সময়ের কম্পোনেন্ট (ঘণ্টা, মিনিট, সেকেন্ড ইত্যাদি) নিয়ে কাজ করেন, তাহলে আপনি রেফারেন্স তারিখ ছাড়াই স্বাভাবিকীকরণ করতে পারেন:

const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //or omit relativeTo argument
console.log(normalizedDuration.toString()); // Output: P1DT2H1M

ডিউরেশন তুলনা করা

আপনি compare() মেথড ব্যবহার করে ডিউরেশন তুলনা করতে পারেন। এই মেথডটি প্রদান করে:

const duration1 = Temporal.Duration.from("P1Y");
const duration2 = Temporal.Duration.from("P6M");

const comparisonResult = Temporal.Duration.compare(duration1, duration2);
console.log(comparisonResult); // Output: 1

ব্যবহারিক উদাহরণ

১. একটি ইভেন্ট পর্যন্ত সময় গণনা করা

ধরুন আপনি একটি নির্দিষ্ট ইভেন্ট পর্যন্ত বাকি সময় গণনা করতে চান। বর্তমান সময় পেতে Temporal.Now.zonedDateTimeISO() ব্যবহার করে, এবং ইভেন্টের তারিখ বিয়োগ করে। যদি ইভেন্টের তারিখ পার হয়ে যায়, তাহলে আউটপুট ঋণাত্মক হবে।

const eventDate = Temporal.ZonedDateTime.from({ timeZone: 'America/Los_Angeles', year: 2024, month: 12, day: 25, hour: 9, minute: 0, second: 0 });
const now = Temporal.Now.zonedDateTimeISO('America/Los_Angeles');

const durationUntilEvent = eventDate.since(now);

console.log(durationUntilEvent.toString()); // Output: e.g., P262DT14H30M (depending on the current date and time)

২. প্রজেক্ট টাস্কের ডিউরেশন ট্র্যাক করা

প্রজেক্ট ম্যানেজমেন্টে, আপনি টাস্কের আনুমানিক বা প্রকৃত সময়কাল ট্র্যাক করতে Temporal.Duration ব্যবহার করতে পারেন।

const task1EstimatedDuration = Temporal.Duration.from("PT8H"); // 8 hours
const task2EstimatedDuration = Temporal.Duration.from("PT16H"); // 16 hours

const totalEstimatedDuration = task1EstimatedDuration.add(task2EstimatedDuration);
console.log(`Total estimated duration: ${totalEstimatedDuration.toString()}`); // Output: Total estimated duration: P1DT

৩. বয়স গণনা করা

যদিও সঠিকভাবে বয়স গণনা করার জন্য লিপ ইয়ার এবং সময় অঞ্চল বিবেচনা করা প্রয়োজন, Temporal.Duration একটি যুক্তিসঙ্গত অনুমান প্রদান করতে পারে:

const birthDate = Temporal.PlainDate.from("1990-05-15");
const currentDate = Temporal.PlainDate.from("2024-01-20");

const ageDuration = currentDate.since(birthDate, { smallestUnit: 'years' });
console.log(`Estimated age: ${ageDuration.years} years`); // Output: Estimated age: 33 years

৪. মানুষের পাঠযোগ্য ডিউরেশন প্রদর্শন করা

প্রায়শই, আপনাকে মানুষের পাঠযোগ্য ফরম্যাটে ডিউরেশন প্রদর্শন করতে হয়। যদিও Temporal.Duration-এ বিল্ট-ইন ফরম্যাটিং ফাংশন নেই, আপনি কাস্টম ফরম্যাটিং লজিক তৈরি করতে পারেন:

function formatDuration(duration) {
  const parts = [];
  if (duration.years) parts.push(`${duration.years} year${duration.years > 1 ? 's' : ''}`);
  if (duration.months) parts.push(`${duration.months} month${duration.months > 1 ? 's' : ''}`);
  if (duration.days) parts.push(`${duration.days} day${duration.days > 1 ? 's' : ''}`);
  if (duration.hours) parts.push(`${duration.hours} hour${duration.hours > 1 ? 's' : ''}`);
  if (duration.minutes) parts.push(`${duration.minutes} minute${duration.minutes > 1 ? 's' : ''}`);
  if (duration.seconds) parts.push(`${duration.seconds} second${duration.seconds > 1 ? 's' : ''}`);

  return parts.join(', ');
}

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // Output: 1 year, 2 months, 10 days, 2 hours, 30 minutes

উন্নত ব্যবহার এবং বিবেচ্য বিষয়

১. টাইম জোন হ্যান্ডলিং

যখন সময় অঞ্চলের সীমানা বা ডেলাইট সেভিং টাইম পরিবর্তন অতিক্রমকারী সময় ব্যবধান নিয়ে কাজ করা হয়, তখন সঠিক গণনা নিশ্চিত করতে Temporal.ZonedDateTime ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। Temporal.PlainDate এবং Temporal.PlainTime ব্যবহার করলে যেকোনো টাইম জোন রূপান্তর এড়ানো যাবে।

২. ক্ষুদ্রতম একক এবং রাউন্ডিং

since() এবং until() মেথডগুলি প্রায়শই ফলাফলের ডিউরেশনের জন্য ক্ষুদ্রতম একক নির্ধারণ করার অপশন গ্রহণ করে। উদাহরণস্বরূপ, একটি ইভেন্ট *পর্যন্ত* সময় গণনা করা এবং ফলাফলকে দিন পর্যন্ত সীমাবদ্ধ করা।

const eventDate = Temporal.PlainDate.from("2024-12-25");
const now = Temporal.PlainDate.from("2024-01-20");

const durationUntilEvent = now.until(eventDate, { smallestUnit: 'days' });

console.log(durationUntilEvent.toString()); //example output PT340D

৩. লিপ সেকেন্ড

টেম্পোরাল স্বাভাবিকভাবে লিপ সেকেন্ডের হিসাব রাখে না। যদি আপনার চরম নির্ভুলতার প্রয়োজন হয়, তাহলে আপনাকে লিপ সেকেন্ড আলাদাভাবে পরিচালনা করতে হবে।

৪. IANA টাইম জোন

টেম্পোরাল এপিআই IANA (Internet Assigned Numbers Authority) টাইম জোন ডেটাবেসের উপর নির্ভর করে। আপনার পরিবেশে IANA ডেটাবেসের একটি আপ-টু-ডেট সংস্করণ আছে তা নিশ্চিত করুন যাতে টাইম জোন রূপান্তর সঠিকভাবে পরিচালনা করা যায়।

সেরা অনুশীলন

সাধারণ ভুলত্রুটি

বিভিন্ন সংস্কৃতি জুড়ে বাস্তব-জগতের ব্যবহারের ক্ষেত্র

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

উপসংহার

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

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