জাভাস্ক্রিপ্টে লেখা প্রায় যেকোনো ধরনের অ্যাপ্লিকেশন কিছু ক্ষমতায় সময় বা তারিখের সাথে কাজ করে। শুরুতে, এটি অন্তর্নির্মিত তারিখ API-এর মধ্যে সীমাবদ্ধ ছিল। এই API-তে মৌলিক কার্যকারিতা রয়েছে, তবে এটি যা করতে পারে তার মধ্যে বেশ সীমিত। Moment.js-এর মতো তৃতীয় পক্ষের লাইব্রেরি এবং পরে অন্তর্নির্মিত API যেমন Intl API এবং নতুন টেম্পোরাল API, সময় এবং তারিখের সাথে কাজ করার জন্য অনেক বেশি নমনীয়তা যোগ করে। Moment.js এর উত্থান এবং পতন Moment.js হল একটি জাভাস্ক্রিপ্ট লাইব্রেরি যেখানে সময় এবং তারিখের সাথে কাজ করার জন্য শক্তিশালী ইউটিলিটি রয়েছে। এতে মৌলিক তারিখ এপিআই থেকে অনুপস্থিত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে, যেমন টাইম জোন ম্যানিপুলেশন, এবং অনেক সাধারণ ক্রিয়াকলাপকে সহজ করে তোলে। মুহূর্ত তারিখ এবং সময় ফর্ম্যাট করার জন্য ফাংশনও অন্তর্ভুক্ত করে। এটি বিভিন্ন অ্যাপ্লিকেশনে একটি বহুল ব্যবহৃত লাইব্রেরি হয়ে উঠেছে। যাইহোক, মোমেন্টেরও সমস্যা ছিল। এটি একটি বড় লাইব্রেরি, এবং একটি অ্যাপ্লিকেশনের বান্ডিল আকারে উল্লেখযোগ্যভাবে যোগ করতে পারে। যেহেতু লাইব্রেরি গাছ কাঁপানোকে সমর্থন করে না (আধুনিক বান্ডলারের একটি বৈশিষ্ট্য যা লাইব্রেরির অব্যবহৃত অংশগুলিকে সরিয়ে দিতে পারে), আপনি শুধুমাত্র একটি বা দুটি ফাংশন ব্যবহার করলেও সম্পূর্ণ মোমেন্ট লাইব্রেরি অন্তর্ভুক্ত করা হয়। মোমেন্টের সাথে আরেকটি সমস্যা হল এটি যে বস্তুগুলি তৈরি করে তা পরিবর্তনযোগ্য। একটি মোমেন্ট অবজেক্টে নির্দিষ্ট ফাংশন কল করার পার্শ্ব প্রতিক্রিয়া রয়েছে এবং সেই বস্তুর মান পরিবর্তন করে। এটি অপ্রত্যাশিত আচরণ বা বাগ হতে পারে। 2020 সালে, মোমেন্টের রক্ষণাবেক্ষণকারীরা লাইব্রেরিটিকে রক্ষণাবেক্ষণ মোডে রাখার সিদ্ধান্ত নিয়েছে। কোন নতুন বৈশিষ্ট্য উন্নয়ন করা হচ্ছে না, এবং রক্ষণাবেক্ষণকারীরা নতুন প্রকল্পের জন্য এটি ব্যবহার করার বিরুদ্ধে সুপারিশ করে। অন্যান্য জাভাস্ক্রিপ্ট ডেট লাইব্রেরি আছে, যেমন date-fns, কিন্তু শহরে একটি নতুন প্লেয়ার আছে, একটি API সরাসরি JavaScript-এ তৈরি করা হয়েছে: Temporal। এটি একটি নতুন স্ট্যান্ডার্ড যা মূল তারিখ API-এর গর্তগুলি পূরণ করার পাশাপাশি মোমেন্ট এবং অন্যান্য লাইব্রেরিতে পাওয়া কিছু সীমাবদ্ধতার সমাধান করে। টেম্পোরাল কি? টেম্পোরাল হল একটি নতুন সময় এবং তারিখ API ECMAScript স্ট্যান্ডার্ডে যোগ করা হচ্ছে, যা আধুনিক জাভাস্ক্রিপ্টকে সংজ্ঞায়িত করে। 20266 সালের মার্চ পর্যন্ত, এটি TC39 প্রক্রিয়ার 4 ধাপে পৌঁছেছে (যে কমিটি জাভাস্ক্রিপ্ট ভাষায় প্রস্তাবনা এবং সংযোজন তত্ত্বাবধান করে), এবং ECMAScript স্পেসিফিকেশনের পরবর্তী সংস্করণে অন্তর্ভুক্ত করা হবে। এটি ইতিমধ্যেই বেশ কয়েকটি ব্রাউজারে প্রয়োগ করা হয়েছে: Chrome 144+ এবং Firefox 139+, Safari শীঘ্রই অনুসরণ করবে বলে আশা করা হচ্ছে। একটি পলিফিল অসমর্থিত ব্রাউজার এবং Node.js-এর জন্যও উপলব্ধ। টেম্পোরাল এপিআই এমন বস্তু তৈরি করে যা সাধারণত সময়ের মধ্যে মুহূর্তগুলিকে উপস্থাপন করে। এগুলি একটি নির্দিষ্ট সময় অঞ্চলে ফুল-টাইম এবং তারিখের স্ট্যাম্প হতে পারে, অথবা এগুলি কোনও সময় অঞ্চল বা তারিখের তথ্য ছাড়াই "ওয়াল ঘড়ি" সময়ের একটি সাধারণ উদাহরণ হতে পারে৷ টেম্পোরালের কিছু প্রধান বৈশিষ্ট্যের মধ্যে রয়েছে:

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

এটি লক্ষ্য করাও গুরুত্বপূর্ণ যে তারিখ API চলে যাচ্ছে না। যখন টেম্পোরাল এই APIটিকে সরিয়ে দেয়, এটিকে সরানো বা অবমূল্যায়ন করা হচ্ছে না। ব্রাউজার হঠাৎ তারিখ API মুছে ফেললে অনেক অ্যাপ্লিকেশন ভেঙে যাবে। যাইহোক, এটাও মনে রাখবেন যে মোমেন্ট এখন রক্ষণাবেক্ষণ মোডে একটি উত্তরাধিকার প্রকল্প হিসাবে বিবেচিত হয়। নিবন্ধের বাকি অংশে, আমরা নতুন টেম্পোরাল API-এ মোমেন্ট-ভিত্তিক কোড স্থানান্তর করার জন্য কিছু "রেসিপি" দেখব। এর রিফ্যাক্টরিং শুরু করা যাক! তারিখ এবং সময় অবজেক্ট তৈরি করা আমরা তারিখ এবং সময় ম্যানিপুলেট করার আগে, আমাদের তাদের প্রতিনিধিত্বকারী বস্তু তৈরি করতে হবে। বর্তমান তারিখ এবং সময় প্রতিনিধিত্ব করে একটি মোমেন্ট অবজেক্ট তৈরি করতে, মোমেন্ট ফাংশন ব্যবহার করুন। const now = moment(); console.log(এখন); // মুহূর্ত<2026-02-18T21:26:29-05:00>

এই অবজেক্টটি এখন প্রয়োজন অনুসারে ফর্ম্যাট বা ম্যানিপুলেট করা যেতে পারে।

// ইউটিসিতে রূপান্তর করুন //সতর্কতা: এটি মোমেন্ট অবজেক্টকে পরিবর্তন করে এবং এটিকে UTC মোডে রাখে! console.log(now.utc()); // মুহূর্ত<2026-02-19T02:26:29Z>

// একটি বিন্যাসিত স্ট্রিং মুদ্রণ করুন - মনে রাখবেন যে এটি এখন UTC সময় ব্যবহার করছে console.log(now.format('MM/DD/YYYY hh:mm:ss a')); // 02/19/2026 02:27:07 am

মোমেন্ট সম্পর্কে মনে রাখার মূল বিষয় হল একটি মোমেন্ট অবজেক্ট সবসময় সময় এবং তারিখ সম্পর্কে তথ্য অন্তর্ভুক্ত করে। আপনার যদি শুধুমাত্র সময়ের তথ্য নিয়ে কাজ করতে হয়, তবে এটি সাধারণত ঠিক থাকে, তবে এটি ডেলাইট সেভিং টাইম বা লিপ ইয়ারের মতো পরিস্থিতিতে অপ্রত্যাশিত আচরণের কারণ হতে পারে, যেখানে তারিখটি সময় গণনার উপর প্রভাব ফেলতে পারে। টেম্পোরাল আরও নমনীয়। আপনি একটি Temporal.Instant অবজেক্ট তৈরি করে বর্তমান তারিখ এবং সময়ের প্রতিনিধিত্বকারী একটি বস্তু তৈরি করতে পারেন। এটি "দ্য ইপোক" (1 জানুয়ারী, 1970-এ মধ্যরাতের ইউটিসি) সময় দ্বারা সংজ্ঞায়িত সময়ের একটি বিন্দু প্রতিনিধিত্ব করে। টেম্পোরাল ন্যানোসেকেন্ড-স্তরের নির্ভুলতার সাথে সময়ে এই তাত্ক্ষণিককে উল্লেখ করতে পারে। const now = Temporal.Now.instant();

// যুগ থেকে কাঁচা ন্যানোসেকেন্ড দেখুন console.log(now.epochNanoseconds); // 1771466342612000000n

// UTC-এর জন্য বিন্যাস console.log(now.toString()); // 2026-02-19T01:55:27.844Z

// একটি নির্দিষ্ট সময় অঞ্চলের জন্য বিন্যাস console.log(now.toString({ timeZone: 'America/New_York' })); // 2026-02-18T20:56:57.905-05:00

ফ্রম স্ট্যাটিক পদ্ধতি ব্যবহার করে একটি নির্দিষ্ট সময় এবং তারিখের জন্য টেম্পোরাল. ইনস্ট্যান্ট অবজেক্টগুলিও তৈরি করা যেতে পারে।

const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');

// স্থানীয় সময় অঞ্চলে তাত্ক্ষণিক ফর্ম্যাট করুন৷ মনে রাখবেন যে এটি শুধুমাত্র নিয়ন্ত্রণ করে // বিন্যাস - এটি বস্তুকে পরিবর্তন করে না যেমন moment.utc করে। console.log(myInstant.toString({ timeZone: 'America/New_York' })); // 2026-02-18T21:10:00-05:00

আপনি অন্যান্য ধরণের টেম্পোরাল অবজেক্টও তৈরি করতে পারেন, যার মধ্যে রয়েছে:

Temporal.PlainDate: কোন সময় তথ্য ছাড়া একটি তারিখ. Temporal.PlainTime: কোনো তারিখ তথ্য ছাড়া একটি সময়. Temporal.ZonedDateTime: একটি নির্দিষ্ট সময় অঞ্চলে একটি তারিখ এবং সময়।

এর প্রত্যেকটির একটি ফ্রম পদ্ধতি রয়েছে যা তারিখ এবং/অথবা সময় নির্দিষ্ট করে বা পার্স করার জন্য একটি তারিখের স্ট্রিং দিয়ে কল করা যেতে পারে। // শুধু একটি তারিখ const today = Temporal.PlainDate.from({ বছর: 2026, মাস: 2, // নোট করুন আমরা ফেব্রুয়ারির জন্য 2 ব্যবহার করছি দিন: 18 }); console.log(today.toString()); // 2026-02-18

// শুধু একটি সময় const lunchTime = Temporal.PlainTime.from({ ঘন্টা: 12 }); console.log(lunchTime.toString()); // 12:00:00

// মার্কিন পূর্ব সময় অঞ্চলে একটি তারিখ এবং সময়৷ const dueAt = Temporal.ZonedDateTime.from({ টাইমজোন: 'আমেরিকা/নিউইয়র্ক', বছর: 2026, মাস: 3, দিন: 1, ঘন্টা: 12, মিনিট: 0, দ্বিতীয়: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[আমেরিকা/নিউইয়র্ক]

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

const isoDate = moment('2026-02-21T09:00:00'); const formattedDate = moment('2/21/26 9:00:00', 'M/D/YY h:mm:ss');

console.log(isoDate); // মুহূর্ত<2026-02-21T09:00:00-05:00>

console.log(formattedDate); // মুহূর্ত<2026-02-21T09:00:00-05:00>

পুরানো সংস্করণগুলিতে, মোমেন্ট যে কোনও নির্বিচারে ফর্ম্যাট করা তারিখের স্ট্রিংকে পার্স করার জন্য সর্বোত্তম অনুমান করবে। এটি অপ্রত্যাশিত ফলাফল হতে পারে। উদাহরণস্বরূপ, 02-03-2026 ফেব্রুয়ারি 2 বা 3 মার্চ? এই কারণে, মোমেন্টের নতুন সংস্করণগুলি একটি বিশিষ্ট অবচয় সতর্কতা প্রদর্শন করে যদি এটি একটি ISO ফর্ম্যাট করা তারিখের স্ট্রিং ছাড়া কল করা হয় (যদি না পছন্দসই বিন্যাসের সাথে দ্বিতীয় যুক্তিটিও দেওয়া হয়)। টেম্পোরাল শুধুমাত্র একটি নির্দিষ্টভাবে ফর্ম্যাট করা তারিখ স্ট্রিং পার্স করবে। স্ট্রিংটি অবশ্যই ISO 8601 ফরম্যাট বা এর এক্সটেনশন, RFC 9557 এর সাথে সঙ্গতিপূর্ণ হতে হবে। যদি একটি অ-সম্মতিশীল তারিখ স্ট্রিং একটি থেকে পদ্ধতিতে পাস করা হয়, টেম্পোরাল একটি RangeError নিক্ষেপ করবে।

// একটি RFC 9557 তারিখ স্ট্রিং ব্যবহার করে const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[America/New_York]'); console.log(myDate.toString({ timeZone: 'America/New_York' })); // 2026-02-21T09:00:00-05:00

// একটি অজানা তারিখ স্ট্রিং ব্যবহার করে const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // RangeError: টেম্পোরাল ত্রুটি: বছরের মান পার্স করার সময় অবৈধ অক্ষর।

তারিখ স্ট্রিং এর সঠিক প্রয়োজনীয়তা নির্ভর করে আপনি কোন ধরনের টেম্পোরাল অবজেক্ট তৈরি করছেন তার উপর। উপরের উদাহরণে, Temporal.Instant-এর একটি সম্পূর্ণ ISO প্রয়োজন8601 বা RFC 9557 তারিখের স্ট্রিং একটি টাইম জোন অফসেটের সাথে তারিখ এবং সময় নির্দিষ্ট করে, তবে আপনি তারিখ বিন্যাসের একটি উপসেট ব্যবহার করে প্লেইনডেট বা প্লেইনটাইম অবজেক্টও তৈরি করতে পারেন। const myDate = Temporal.PlainDate.from('2026-02-21'); console.log(myDate.toString()); // 2026-02-21

const myTime = Temporal.PlainTime.from('09:00:00'); console.log(myTime.toString()); // 09:00:00

মনে রাখবেন যে এই স্ট্রিংগুলিকে এখনও প্রত্যাশিত বিন্যাস মেনে চলতে হবে, নতুবা একটি ত্রুটি নিক্ষেপ করা হবে৷

// একটি নন-কমপ্লায়েন্ট টাইম স্ট্রিং ব্যবহার করা। এই সব একটি RangeError নিক্ষেপ করবে. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');

প্রো টিপ: নন-আইএসও স্ট্রিংগুলি পরিচালনা করা যেহেতু টেম্পোরাল নির্ভরযোগ্যতাকে অগ্রাধিকার দেয়, এটি 02-01-2026 এর মতো একটি স্ট্রিংয়ের বিন্যাস অনুমান করার চেষ্টা করবে না। যদি আপনার ডেটা সোর্স এই ধরনের স্ট্রিং ব্যবহার করে, তাহলে টেম্পোরালের সাথে এটি ব্যবহার করার চেষ্টা করার আগে আপনাকে 2026-02-01 এর মতো একটি ISO স্ট্রিং-এ মানগুলিকে পুনর্বিন্যাস করতে কিছু স্ট্রিং ম্যানিপুলেশন করতে হবে।

ফরম্যাটিং একবার আপনার কাছে একটি মুহূর্ত বা টেম্পোরাল অবজেক্ট থাকলে, আপনি সম্ভবত এটিকে কোনও সময়ে ফর্ম্যাট করা স্ট্রিংয়ে রূপান্তর করতে চাইবেন। এটি এমন একটি উদাহরণ যেখানে মুহূর্তটি একটু বেশি পরিপূর্ণ। আপনি টোকেনগুলির একটি স্ট্রিং সহ অবজেক্টের বিন্যাস পদ্ধতিকে কল করেন যা পছন্দসই তারিখ বিন্যাস বর্ণনা করে। const date = moment();

console.log(date.format('MM/DD/YYYY')); // 02/22/2026

console.log(date.format('MMMM Do YYYY, h:mm:ss a')); // 22শে ফেব্রুয়ারি 2026, 8:18:30 pm

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

const date = Temporal.Now.instant();

// কোন যুক্তি ছাড়াই, আমরা বর্তমান লোকেলের জন্য ডিফল্ট বিন্যাস পাব console.log(date.toLocaleString()); // 2/22/2026, 8:23:36 PM (en-US এর একটি লোকেল ধরে নেওয়া)

// একটি কাস্টম বিন্যাস স্ট্রিং তৈরি করতে ফর্ম্যাটিং বিকল্পগুলি পাস করুন৷ console.log(date.toLocaleString('en-US', { মাস: 'দীর্ঘ', দিন: 'সংখ্যাসূচক', বছর: 'সংখ্যাসূচক', ঘন্টা: '2-সংখ্যা', মিনিট: '2-সংখ্যা' })); // ফেব্রুয়ারি 22, 2026 রাত 8:23 এ

// শুধুমাত্র ফরম্যাট স্ট্রিং এ আপনি যে ক্ষেত্রগুলি চান তা পাস করুন console.log(date.toLocaleString('en-US', { মাস: 'ছোট', দিন: 'সংখ্যাসূচক' })); // 22 ফেব্রুয়ারী

টেম্পোরাল ডেট ফরম্যাটিং আসলে হুডের নিচে Intl.DateTimeFormat API (যা আধুনিক ব্রাউজারে সহজলভ্য) ব্যবহার করে। এর মানে হল আপনি আপনার কাস্টম ফর্ম্যাটিং বিকল্পগুলির সাথে একটি পুনঃব্যবহারযোগ্য DateTimeFormat অবজেক্ট তৈরি করতে পারেন, তারপর টেম্পোরাল অবজেক্টগুলিকে এর ফর্ম্যাট পদ্ধতিতে পাস করুন। এই কারণে, এটি মোমেন্টের মতো কাস্টম তারিখ বিন্যাস সমর্থন করে না। আপনার যদি 'Q1 2026' বা অন্যান্য বিশেষায়িত বিন্যাসের মতো কিছুর প্রয়োজন হয়, তাহলে আপনার কিছু কাস্টম তারিখ বিন্যাস কোডের প্রয়োজন হতে পারে বা তৃতীয় পক্ষের লাইব্রেরিতে পৌঁছাতে পারে। const formatter = new Intl.DateTimeFormat('en-US', { মাস: '2-সংখ্যা', দিন: '2-সংখ্যা', বছর: 'সংখ্যাসূচক' });

const date = Temporal.Now.instant(); console.log(formatter.format(তারিখ)); // 02/22/2026

মোমেন্টের ফরম্যাটিং টোকেনগুলি লিখতে সহজ, কিন্তু সেগুলি লোকেল-বান্ধব নয়৷ ফর্ম্যাট স্ট্রিং "হার্ড কোড" মাস/দিনের ক্রম মত জিনিস. একটি কনফিগারেশন অবজেক্ট ব্যবহার করার সুবিধা, যেমন টেম্পোরাল করে, এটি স্বয়ংক্রিয়ভাবে যে কোনো প্রদত্ত লোকেলে মানিয়ে নেবে এবং সঠিক বিন্যাস ব্যবহার করবে। const date = Temporal.Now.instant();

const formatOptions = { মাস: 'সংখ্যাসূচক', দিন: 'সংখ্যাসূচক', বছর: 'সংখ্যাসূচক' };

console.log(date.toLocaleString('en-US', formatOptions)); // 2/22/2026

console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026

তারিখ গণনা অনেক অ্যাপ্লিকেশনে, আপনাকে একটি তারিখে কিছু গণনা সম্পাদন করতে হবে। আপনি সময়ের একক যোগ বা বিয়োগ করতে চাইতে পারেন (দিন, ঘন্টা, সেকেন্ড, ইত্যাদি)। উদাহরণস্বরূপ, যদি আপনার বর্তমান তারিখ থাকে, তাহলে আপনি ব্যবহারকারীকে এখন থেকে 1 সপ্তাহের তারিখ দেখাতে চাইতে পারেন। মোমেন্ট অবজেক্টের যোগ এবং বিয়োগের মতো পদ্ধতি রয়েছে যা এই ক্রিয়াকলাপগুলি সম্পাদন করে। এই ফাংশনগুলি একটি মান এবং একটি ইউনিট নেয়, উদাহরণস্বরূপ: add(7, 'days')। মোমেন্ট এবং টেম্পোরালের মধ্যে একটি খুব গুরুত্বপূর্ণ পার্থক্য, যাইহোক, এই তারিখ গণনা করার সময়, অন্তর্নিহিত বস্তুটি পরিবর্তিত হয় এবং এর আসল মান হারিয়ে যায়। const now = moment();

console.log(এখন); // মুহূর্ত<2026-02-24T20:08:36-05:00>

const nextWeek = now.add(7, 'days'); console.log(পরবর্তী সপ্তাহ); // মুহূর্ত<2026-03-03T20:08:36-05:00>

// গোটচা - আসল বস্তুটি পরিবর্তিত হয়েছিল console.log(এখন); // মুহূর্ত<2026-03-03T20:08:36-05:00>

আসল তারিখ হারানো এড়াতে, আপনি একটি অনুলিপি তৈরি করতে মোমেন্ট অবজেক্টে ক্লোন কল করতে পারেন। const এখন= মুহূর্ত(); const nextWeek = now.clone().add(7, 'days');

console.log(এখন); // মুহূর্ত<2026-02-24T20:12:55-05:00>

console.log(পরবর্তী সপ্তাহ); // মুহূর্ত<2026-03-03T20:12:55-05:00>

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

const now = Temporal.Now.instant(); const nextWeek = now.add({ দিন: 7 }); // RangeError: টেম্পোরাল ত্রুটি: সবচেয়ে বড় ইউনিট একটি তারিখ ইউনিট হতে পারে না

কারণ তাত্ক্ষণিক বস্তুগুলি UTC-তে একটি নির্দিষ্ট বিন্দুর প্রতিনিধিত্ব করে এবং ক্যালেন্ডার-অজ্ঞেয়বাদী। যেহেতু ডেলাইট সেভিং টাইমের মতো সময় অঞ্চলের নিয়মের উপর ভিত্তি করে একটি দিনের দৈর্ঘ্য পরিবর্তিত হতে পারে, এই গণনাটি তাত্ক্ষণিকভাবে উপলব্ধ নয়৷ যাইহোক, আপনি এই অপারেশনটি অন্যান্য ধরণের অবজেক্টে করতে পারেন, যেমন একটি PlainDateTime: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 2/24/2026, 8:23:59 PM

const nextWeek = now.add({ দিন: 7 });

// নোট করুন যে মূল PlainDateTime অপরিবর্তিত থাকে console.log(now.toLocaleString()); // 2/24/2026, 8:23:59 PM

console.log(nextWeek.toLocaleString()); // 3/3/2026, 8:23:59 PM

আপনি দুটি মোমেন্ট বা টেম্পোরাল বস্তুর মধ্যে কত সময় আছে তাও গণনা করতে পারেন। মোমেন্টের ডিফ ফাংশনের সাথে, আপনাকে গ্রানুলারিটির জন্য একটি ইউনিট প্রদান করতে হবে, অন্যথায় এটি মিলিসেকেন্ডে পার্থক্য ফিরিয়ে দেবে। const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');

console.log(date2.diff(date1)); // 91800000

console.log(date2.diff(date1, 'days')); // ১

একটি টেম্পোরাল অবজেক্টের সাথে এটি করার জন্য, আপনি অন্য টেম্পোরাল অবজেক্টকে এটি পর্যন্ত বা তারপর থেকে পদ্ধতিতে পাস করতে পারেন। এটি একটি Temporal.Duration অবজেক্ট প্রদান করে যেখানে সময়ের পার্থক্য সম্পর্কে তথ্য রয়েছে। ডিউরেশন অবজেক্টের পার্থক্যের প্রতিটি উপাদানের জন্য বৈশিষ্ট্য রয়েছে এবং এটি একটি ISO 8601 সময়কালের পার্থক্যকে উপস্থাপন করে একটি স্ট্রিং তৈরি করতে পারে।

const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');

// বৃহত্তম ইউনিট প্রতিনিধিত্ব করার জন্য সময়ের বৃহত্তম একক নির্দিষ্ট করে // সময়কাল গণনার মধ্যে const diff = date2.since(তারিখ1, { বৃহত্তম ইউনিট: 'দিন' });

console.log(diff.days); // ১

console.log(diff.hours); // ১

console.log(diff.minutes); // 30

console.log(diff.toString()); // P1DT1H30M // (ISO 8601 সময়কাল স্ট্রিং: 1 দিন, 1 ঘন্টা, 30 মিনিট)

তারিখ এবং সময় তুলনা মোমেন্ট এবং টেম্পোরাল উভয়ই আপনাকে তারিখ এবং সময়ের তুলনা করতে দেয় যেটি অন্যের আগে আসে তা নির্ধারণ করতে, কিন্তু API এর সাথে ভিন্ন পদ্ধতি গ্রহণ করে। মোমেন্ট দুটি মোমেন্ট অবজেক্টের তুলনা করার জন্য isBefore, isAfter এবং isSame এর মত পদ্ধতি প্রদান করে। const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');

console.log(date1.isBefore(date2)); // সত্য

টেম্পোরাল একই ধরণের দুটি বস্তুর মধ্যে তুলনা করার জন্য একটি স্ট্যাটিক তুলনা পদ্ধতি ব্যবহার করে। যদি প্রথম তারিখটি দ্বিতীয়টির আগে আসে তবে এটি -1, যদি তারা সমান হয় 0, অথবা 1 যদি প্রথম তারিখটি দ্বিতীয়টির পরে আসে। নিম্নলিখিত উদাহরণ দেখায় কিভাবে দুটি PlainDate বস্তুর তুলনা করা যায়। Temporal.PlainDate.compare-এর উভয় আর্গুমেন্ট অবশ্যই PlainDate অবজেক্ট হতে হবে।

const date1 = Temporal.PlainDate.from({ বছর: 2026, মাস: 2, দিন: 24}); const date2 = Temporal.PlainDate.from({ বছর: 2026, মাস: 3, দিন: 24});

// date1 date2 এর আগে আসে, তাই -1 console.log(Temporal.PlainDate.compare(date1, date2));

// আমরা যদি ভিন্ন ধরনের দুটি বস্তুর তুলনা করার চেষ্টা করি তাহলে ত্রুটি console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: টেম্পোরাল ত্রুটি: অবৈধ PlainDate ক্ষেত্র প্রদান করা হয়েছে।

বিশেষ করে, এটি কালানুক্রমিকভাবে টেম্পোরাল বস্তুর অ্যারে সাজানো সহজ করে তোলে। // Temporal.PlainDate অবজেক্টের একটি অ্যারে const তারিখ = [... ];

// তুলনাকারী ফাংশন হিসাবে Temporal.PlainDate.compare ব্যবহার করুন dates.sort(Temporal.PlainDate.compare);

সময় অঞ্চল রূপান্তর মূল মোমেন্ট লাইব্রেরি সময় অঞ্চল রূপান্তর সমর্থন করে না। আপনার যদি এই কার্যকারিতার প্রয়োজন হয় তবে আপনাকে মোমেন্ট-টাইমজোন প্যাকেজটিও ইনস্টল করতে হবে। এই প্যাকেজটি গাছ-কাঁপানো যায় না, এবং তাই আপনার বান্ডিল আকারে উল্লেখযোগ্যভাবে যোগ করতে পারে। একবার আপনি মোমেন্ট-টাইমজোন ইনস্টল করলে, আপনি মোমেন্ট অবজেক্টগুলিকে tz পদ্ধতিতে বিভিন্ন সময় অঞ্চলে রূপান্তর করতে পারেন। অন্যান্য মোমেন্ট অপারেশনের মতো, এটি অন্তর্নিহিতকে পরিবর্তন করেবস্তু // মার্কিন পূর্ব সময় অনুমান const now = moment(); console.log(এখন); // মুহূর্ত<2026-02-28T20:08:20-05:00>

// প্রশান্ত মহাসাগরীয় সময়ে রূপান্তর করুন। // মূল পূর্ব সময় হারিয়ে গেছে। now.tz('America/Los_Angeles'); console.log(এখন); // মুহূর্ত<2026-02-28T17:08:20-08:00>

একটি Temporal.ZonedDateTime অবজেক্ট ব্যবহার করার সময় টাইম জোন কার্যকারিতা টেম্পোরাল API-এ তৈরি করা হয়। এই বস্তুগুলির মধ্যে একটি withTimeZone পদ্ধতি রয়েছে যা একটি নতুন ZonedDateTime প্রদান করে যা একই মুহূর্তকে সময়ের সাথে উপস্থাপন করে, কিন্তু নির্দিষ্ট সময় অঞ্চলে। // আবার, মার্কিন পূর্ব সময় অনুমান const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 2/28/2026, 8:12:02 PM EST

// প্রশান্ত মহাসাগরীয় সময়ে রূপান্তর করুন const nowPacific = now.withTimeZone('America/Los_Angeles'); console.log(nowPacific.toLocaleString()); // 2/28/2026, 5:12:02 PM PST

// মূল বস্তু অপরিবর্তিত থাকে console.log(now.toLocaleString()); // 2/28/2026, 8:12:02 PM EST

দ্রষ্টব্য: toLocaleString দ্বারা প্রত্যাবর্তিত ফর্ম্যাট করা মানগুলি, নাম থেকে বোঝা যায়, লোকেল-নির্ভর৷ নমুনা কোডটি এন-ইউএস লোকেলে তৈরি করা হয়েছে, তাই বিন্যাসটি এই রকম: 2/28/2026, 5:12:02 PM PST৷ অন্য লোকেলে, এটি ভিন্ন হতে পারে। উদাহরণস্বরূপ, এন-জিবি লোকেলে, আপনি 28/2/2026, 17:12:02 GMT-8 এর মত কিছু পাবেন। একটি বাস্তব বিশ্বের রিফ্যাক্টরিং ধরুন আমরা টাইম জোন জুড়ে ইভেন্টের সময় নির্ধারণের জন্য একটি অ্যাপ তৈরি করছি। এই অ্যাপের একটি অংশ হল একটি ফাংশন, getEventTimes, যা একটি ISO 8601 স্ট্রিং নেয় যা ইভেন্টের সময় এবং তারিখ, একটি স্থানীয় সময় অঞ্চল এবং একটি টার্গেট টাইম জোন উপস্থাপন করে৷ ফাংশনটি উভয় সময় অঞ্চলে ইভেন্টের জন্য ফর্ম্যাট করা সময় এবং তারিখের স্ট্রিং তৈরি করে। যদি ফাংশনটিকে একটি ইনপুট স্ট্রিং দেওয়া হয় যা একটি বৈধ সময়/তারিখ স্ট্রিং নয়, এটি একটি ত্রুটি নিক্ষেপ করবে। এখানে মোমেন্ট ব্যবহার করে মূল বাস্তবায়ন (মোমেন্ট-টাইমজোন প্যাকেজ ব্যবহার করা প্রয়োজন)।

'মোমেন্ট-টাইমজোন' থেকে মুহূর্ত আমদানি করুন;

ফাংশন getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h:mm:ss a z';

// 1. ব্যবহারকারীর সময় অঞ্চলে প্রাথমিক মুহূর্ত তৈরি করুন const eventTime = moment.tz( ইনপুটস্ট্রিং, moment.ISO_8601, // একটি ISO 8601 স্ট্রিং আশা করুন সত্য, // কঠোর পার্সিং userTimeZone );

// একটি ত্রুটি নিক্ষেপ যদি ইনপুটস্ট্রিং একটি বৈধ তারিখ প্রতিনিধিত্ব না করে যদি (!eventTime.isValid()) { নতুন ত্রুটি নিক্ষেপ ('অবৈধ তারিখ/সময় ইনপুট'); }

// 2. লক্ষ্য সময়ের গণনা করুন // সমালোচনামূলক: আমাদের অবশ্যই ক্লোন করতে হবে, বা 'ইভেন্টটাইম' চিরতরে পরিবর্তন হবে! const targetTime = eventTime.clone().tz(targetTimeZone);

ফিরে স্থানীয়: eventTime.format(timeFormat), লক্ষ্য: targetTime.format(timeFormat), }; }

const সময়সূচী = getEventTimes( '2026-03-05T15:00-05:00', 'আমেরিকা/নিউইয়র্ক', 'ইউরোপ/লন্ডন', );

console.log(schedule.local); // 5 মার্চ, 2026, বিকাল 3:00:00 ইএসটি

console.log(schedule.target); // 5 মার্চ, 2026, 8:00:00 pm GMT

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

ফাংশন getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. ইনপুটটি সরাসরি একটি ঝটপটে পার্স করুন, তারপর তৈরি করুন // ব্যবহারকারীর জোনে একটি ZonedDateTime। const instant = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);

// 2. লক্ষ্য অঞ্চলে রূপান্তর করুন // এটি স্বয়ংক্রিয়ভাবে একটি নতুন বস্তু ফেরত দেয়; 'ইভেন্টটাইম' নিরাপদ। const targetTime = eventTime.withTimeZone(targetTimeZone);

// 3. Intl ব্যবহার করে বিন্যাস (বিল্ট-ইন) const বিকল্প = { বছর: 'সংখ্যাসূচক', মাস: 'ছোট', দিন: 'সংখ্যাসূচক', ঘন্টা: 'সংখ্যাসূচক', মিনিট: '2-সংখ্যা', দ্বিতীয়: '2-সংখ্যা', টাইমজোনের নাম: 'ছোট' };

ফিরে স্থানীয়: eventTime.toLocaleString(navigator.language, বিকল্প), লক্ষ্য: targetTime.toLocaleString(navigator.language, options) }; }

const সময়সূচী = getEventTimes( '2026-03-05T15:00-05:00', 'আমেরিকা/নিউইয়র্ক', 'ইউরোপ/লন্ডন', );

console.log(schedule.local); // 5 মার্চ, 2026, 3:00:00 PM EST

console.log(schedule.target); // 5 মার্চ, 2026, 8:00:00 PM GMT

মোমেন্টের সাথে, আমাদের ফলাফলের তারিখের স্ট্রিংগুলির জন্য একটি বিন্যাস স্ট্রিং স্পষ্টভাবে উল্লেখ করতে হবে। ব্যবহারকারীর অবস্থান বা লোকেল নির্বিশেষে, ইভেন্টের সময়গুলি সর্বদা 5 মার্চ, 2026, 3:00:00 হিসাবে ফর্ম্যাট করা হবেবিকাল EST. এছাড়াও, আমাদের স্পষ্টভাবে একটি ব্যতিক্রম নিক্ষেপ করতে হবে না। যদি একটি অবৈধ স্ট্রিং Temporal.Instant.from-এ পাস করা হয়, টেম্পোরাল আমাদের জন্য ব্যতিক্রম নিক্ষেপ করবে। একটি বিষয় লক্ষণীয় যে এমনকি কঠোর পার্সিংয়ের সাথেও, মোমেন্ট সংস্করণটি আরও নম্র। টেম্পোরালের জন্য স্ট্রিংয়ের শেষে টাইম জোন অফসেট প্রয়োজন। আপনার আরও মনে রাখা উচিত যে যেহেতু আমরা navigator.language ব্যবহার করছি, এই কোডটি শুধুমাত্র একটি ব্রাউজার পরিবেশে চলবে, কারণ Node.js পরিবেশে নেভিগেটর সংজ্ঞায়িত করা হয় না। টেম্পোরাল ইমপ্লিমেন্টেশন ব্রাউজারের বর্তমান লোকেল (navigator.language) ব্যবহার করে, তাই ব্যবহারকারী স্বয়ংক্রিয়ভাবে ইভেন্টের সময়গুলি তাদের স্থানীয় সময় বিন্যাসে ফরম্যাট পাবেন। এন-ইউএস লোকেলে, এটি 5 মার্চ, 2026, বিকাল 3:00:00 EST। যাইহোক, যদি ব্যবহারকারী লন্ডনে থাকেন, উদাহরণস্বরূপ, ইভেন্টের সময়গুলি 5 মার্চ 2026, 15:00:00 GMT-5 হিসাবে ফর্ম্যাট করা হবে৷ সারাংশ

অ্যাকশন Moment.js অস্থায়ী বর্তমান সময় মুহূর্ত() Temporal.Now.zonedDateTimeISO() আইএসও পার্সিং মুহূর্ত(str) Temporal.Instant.from(str) সময় যোগ করুন .add(7, 'দিন') (পরিবর্তন) .add({ দিন: 7 }) (নতুন বস্তু) পার্থক্য .diff(অন্যান্য, 'ঘন্টা') যেহেতু (অন্যান্য) ঘন্টা সময় অঞ্চল .tz('জোন/নাম') .WithTimeZone('জোন/নাম')

প্রথম নজরে, পার্থক্যটি কিছুটা ভিন্ন হতে পারে (এবং টেম্পোরালের ক্ষেত্রে, কখনও কখনও আরও ভার্বস এবং আরও কঠোর) সিনট্যাক্স, তবে Moment.js এর উপর টেম্পোরাল ব্যবহার করার বেশ কয়েকটি মূল সুবিধা রয়েছে:

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

পলিফিলের উপর নোট আগেই উল্লেখ করা হয়েছে, একটি টেম্পোরাল পলিফিল উপলব্ধ রয়েছে, যা @js-temporal/polyfill নামে একটি npm প্যাকেজ হিসাবে বিতরণ করা হয়েছে। আপনি যদি আজই টেম্পোরাল ব্যবহার করতে চান, তবে সাফারির মতো ব্রাউজারগুলিকে সমর্থন করার জন্য আপনাকে এই পলিফিলের প্রয়োজন হবে যেগুলি এখনও API পাঠায়নি। এর সাথে খারাপ খবর হল এটি আপনার বান্ডিল আকারে যোগ করবে। ভাল খবর হল যে এটি এখনও মুহূর্ত বা মুহূর্ত-টাইমজোনের তুলনায় উল্লেখযোগ্যভাবে কম যোগ করে। এখানে Bundlephobia.com দ্বারা রিপোর্ট করা বান্ডিলের আকারের তুলনা করা হয়েছে, একটি ওয়েবসাইট যা npm প্যাকেজ আকারের তথ্য উপস্থাপন করে (বান্ডেলফোবিয়া বিশ্লেষণ দেখতে প্রতিটি প্যাকেজের নামের উপর ক্লিক করুন):

প্যাকেজ মিনিফাইড ছোট এবং জিজিপ করা হয়েছে @js-টেম্পোরাল/পলিফিল 154.1 kB 44.1 kB মুহূর্ত 294.4 kB 75.4 kB মুহূর্ত-সময় অঞ্চল 1 এমবি 114.2 kB

পলিফিলের ঐতিহাসিকভাবে মেমরি ব্যবহারের আশেপাশে কিছু পারফরম্যান্স সমস্যা ছিল এবং লেখার সময়, এটি একটি আলফা অবস্থায় বিবেচিত হয়। এই কারণে, আপনি এটি আরও পরিপক্ক অবস্থায় না পৌঁছানো পর্যন্ত এটি উৎপাদনে ব্যবহার করতে চান না। অন্য সুসংবাদটি হল যে আশা করি পলিফিলের আর বেশিদিন প্রয়োজন হবে না (যদি না আপনি অবশ্যই পুরানো ব্রাউজারগুলিকে সমর্থন করতে চান)। লেখার সময়, টেম্পোরাল ক্রোম, এজ এবং ফায়ারফক্সে পাঠানো হয়েছে। এটি এখনও সাফারিতে পুরোপুরি প্রস্তুত নয়, যদিও এটি সর্বশেষ প্রযুক্তির পূর্বরূপে রানটাইম পতাকার সাথে উপলব্ধ বলে মনে হচ্ছে।

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free