জাভাস্ক্রিপ্টের টেম্পোরাল এপিআই ব্যবহার করে নির্ভুল এবং স্বজ্ঞাত সময় ব্যবধান গণনার একটি বিশদ নির্দেশিকা, যেখানে ডিউরেশন তৈরি থেকে শুরু করে উন্নত গাণিতিক হিসাব এবং ফরম্যাটিং সবকিছুই অন্তর্ভুক্ত।
জাভাস্ক্রিপ্ট টেম্পোরাল ডিউরেশন: সময় ব্যবধানের গণনা আয়ত্ত করা
জাভাস্ক্রিপ্টের টেম্পোরাল এপিআই তারিখ, সময় এবং সময় ব্যবধান পরিচালনার জন্য একটি আধুনিক এবং শক্তিশালী উপায় प्रस्तुत করে। 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()
মেথড ব্যবহার করে ডিউরেশন তুলনা করতে পারেন। এই মেথডটি প্রদান করে:
- -1 যদি প্রথম ডিউরেশন দ্বিতীয় ডিউরেশনের চেয়ে ছোট হয়।
- 0 যদি ডিউরেশনগুলি সমান হয়।
- 1 যদি প্রথম ডিউরেশন দ্বিতীয় ডিউরেশনের চেয়ে বড় হয়।
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 ডেটাবেসের একটি আপ-টু-ডেট সংস্করণ আছে তা নিশ্চিত করুন যাতে টাইম জোন রূপান্তর সঠিকভাবে পরিচালনা করা যায়।
সেরা অনুশীলন
- ডিউরেশন স্ট্রিংগুলির জন্য ISO 8601 ফরম্যাট ব্যবহার করুন: এটি সামঞ্জস্য এবং আন্তঃকার্যক্ষমতা নিশ্চিত করে।
- উপযুক্ত টেম্পোরাল টাইপ বেছে নিন: আপনার টাইম জোন সমর্থনের প্রয়োজন আছে কি না তার উপর ভিত্তি করে
Temporal.PlainDate
,Temporal.PlainTime
,Temporal.ZonedDateTime
, বাTemporal.Instant
ব্যবহার করুন। - প্রয়োজনে ডিউরেশন স্বাভাবিকীকরণ করুন: স্বাভাবিকীকরণ ডিউরেশনকে সহজ করে এবং তুলনা করা সহজ করে তোলে।
- টাইম জোন সাবধানে পরিচালনা করুন: টাইম জোন রূপান্তর জটিল হতে পারে, তাই
Temporal.ZonedDateTime
ব্যবহার করুন এবং ডেলাইট সেভিং টাইম পরিবর্তনের বিষয়ে সচেতন থাকুন। - ক্ষুদ্রতম একক বিবেচনা করুন: ডিউরেশন গণনা করার সময়, কাঙ্ক্ষিত নির্ভুলতার স্তর পেতে ক্ষুদ্রতম একক নির্দিষ্ট করুন।
- ইউনিট টেস্ট লিখুন: ডিউরেশন গণনা সঠিক কিনা তা নিশ্চিত করতে আপনার কোড পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন।
সাধারণ ভুলত্রুটি
- টাইম জোন উপেক্ষা করা: টাইম জোনের হিসাব না রাখা ভুল ডিউরেশন গণনার কারণ হতে পারে, বিশেষ করে বিভিন্ন স্থানের ইভেন্ট নিয়ে কাজ করার সময়।
- পুরানো Date অবজেক্ট ব্যবহার করা: পুরানো
Date
অবজেক্টটি তার খামখেয়ালিপূর্ণ আচরণ এবং অসঙ্গতির জন্য পরিচিত। আরও নির্ভরযোগ্য তারিখ এবং সময় পরিচালনার জন্য টেম্পোরাল এপিআই পছন্দ করুন। - ডিউরেশন স্বাভাবিকীকরণ না করা: ডিউরেশন স্বাভাবিকীকরণ না করলে তুলনা এবং গণনা আরও জটিল হতে পারে।
- ভুল ISO 8601 ফরম্যাট: একটি অবৈধ ISO 8601 ডিউরেশন স্ট্রিং ব্যবহার করলে ত্রুটি হতে পারে।
বিভিন্ন সংস্কৃতি জুড়ে বাস্তব-জগতের ব্যবহারের ক্ষেত্র
টেম্পোরাল এপিআই বিশ্বব্যাপী অ্যাপ্লিকেশনগুলিতে বিশেষভাবে উপকারী হতে পারে যেখানে সময় অঞ্চলের পার্থক্য এবং সাংস্কৃতিক সূক্ষ্মতা গুরুত্বপূর্ণ। এখানে কিছু উদাহরণ দেওয়া হলো:
- বিশ্বব্যাপী ইভেন্ট শিডিউলিং: একাধিক টাইম জোন জুড়ে সঠিকভাবে ইভেন্ট শিডিউল করা, ডেলাইট সেভিং টাইম পরিবর্তন বিবেচনা করে। উদাহরণস্বরূপ, একটি ওয়েবিনার যা সকাল ৯:০০ PST-তে শুরু হবে এবং CET, JST, এবং AEDT-এর মতো বিভিন্ন টাইম জোনে সংশ্লিষ্ট শুরুর সময় প্রদর্শন করা।
- আন্তর্জাতিক ভ্রমণ পরিকল্পনা: লেওভার এবং টাইম জোন পরিবর্তন সহ ভ্রমণের সময়কাল গণনা করা। এটি ভ্রমণসূচী তৈরি এবং ফ্লাইট সময়সূচী পরিচালনার জন্য দরকারী। উদাহরণস্বরূপ, নিউ ইয়র্ক থেকে টোকিও পর্যন্ত মোট ভ্রমণের সময় গণনা করা, যার মধ্যে লন্ডনে একটি লেওভার এবং টাইম জোনের পার্থক্যের জন্য সামঞ্জস্য অন্তর্ভুক্ত।
- বিশ্বব্যাপী ই-কমার্স: ব্যবহারকারীর স্থানীয় টাইম জোনে আনুমানিক ডেলিভারি সময় প্রদর্শন করা। এর জন্য মূল টাইম জোন, শিপিংয়ের সময়কাল এবং গন্তব্য টাইম জোন বিবেচনা করা প্রয়োজন। উদাহরণস্বরূপ, জার্মানির একটি গুদাম থেকে অস্ট্রেলিয়ার একজন গ্রাহকের কাছে পাঠানো একটি আইটেম, যার আনুমানিক ডেলিভারি সময় ৭ দিন, গ্রাহকের স্থানীয় সময়ে প্রদর্শিত হয়।
- আন্তঃসীমান্ত আর্থিক লেনদেন: বিভিন্ন অঞ্চল জুড়ে সুদের সঞ্চয় বা অর্থপ্রদানের সময়সীমা সঠিকভাবে গণনা করা। এতে প্রায়শই প্রতিটি দেশের বিভিন্ন ব্যবসায়িক দিন এবং ছুটির দিন বিবেচনা করা জড়িত। উদাহরণস্বরূপ, সিঙ্গাপুরের একটি ঋণের উপর অর্জিত সুদ গণনা করা, সিঙ্গাপুরের সরকারি ছুটি বিবেচনা করে।
- বহুসাংস্কৃতিক ক্যালেন্ডার অ্যাপ্লিকেশন: ইসলামিক বা হিব্রু ক্যালেন্ডারের মতো বিভিন্ন ক্যালেন্ডার সিস্টেম সমর্থন করা এবং এই ক্যালেন্ডারগুলির উপর ভিত্তি করে ইভেন্টের সময়কাল এবং অনুস্মারক সঠিকভাবে গণনা করা।
- বিশ্বব্যাপী প্রজেক্ট ম্যানেজমেন্ট: বিভিন্ন কাজের সময়সূচী এবং টাইম জোন বিবেচনা করে বিতরণ করা দলগুলির মধ্যে প্রজেক্ট টাস্কের সময়কাল এবং সময়সীমা ট্র্যাক করা।
উপসংহার
Temporal.Duration
জাভাস্ক্রিপ্টে সময়ের ব্যবধান নিয়ে কাজ করার জন্য একটি শক্তিশালী এবং স্বজ্ঞাত উপায় প্রদান করে। এর বৈশিষ্ট্য এবং সেরা অনুশীলনগুলি বোঝার মাধ্যমে, আপনি আপনার অ্যাপ্লিকেশনগুলিতে আত্মবিশ্বাসের সাথে সঠিক এবং নির্ভরযোগ্য ডিউরেশন গণনা করতে পারেন। টেম্পোরাল এপিআই গ্রহণ করলে কোড আরও পরিষ্কার, রক্ষণাবেক্ষণযোগ্য হয় এবং পুরোনো তারিখ ও সময় পরিচালনার সাথে যুক্ত ত্রুটির ঝুঁকি হ্রাস পায়।
আপনি যখন টেম্পোরাল এপিআই-এর গভীরে প্রবেশ করবেন, তখন অফিসিয়াল ডকুমেন্টেশন পরামর্শ করতে এবং এর ক্ষমতা সম্পূর্ণরূপে উপলব্ধি করার জন্য বিভিন্ন পরিস্থিতি নিয়ে পরীক্ষা করতে ভুলবেন না। এর আধুনিক নকশা এবং ব্যাপক বৈশিষ্ট্যগুলির সাথে, টেম্পোরাল জাভাস্ক্রিপ্টে আমাদের তারিখ, সময় এবং ডিউরেশন পরিচালনার পদ্ধতিকে বিপ্লবী পরিবর্তন করতে প্রস্তুত।