সময়কে সহজ মনে হয় যতক্ষণ না আপনি সঠিকভাবে এটি হ্যান্ডেল করে এমন সফটওয়্যার লিখতে চেষ্টা করেন। "বিকাল ৩টায়" নির্ধারিত একটি ইভেন্ট টোকিও, লন্ডন এবং নিউ ইয়র্কে ভিন্ন জিনিস বোঝায়। ডেলাইট সেভিং টাইম ঘড়ি এগিয়ে বা পিছিয়ে দেয় — কিন্তু সব জায়গায় নয়, এবং একই তারিখেও নয়। আপনার লোকাল এনভায়রনমেন্টে সঠিক দেখায় এমন একটি টাইমস্ট্যাম্প প্রোডাকশনে ভেঙে যায় কারণ সার্ভার ভিন্ন জোনে আছে।
টাইম জোন সফটওয়্যার ডেভেলপমেন্টে সবচেয়ে নির্ভরযোগ্যভাবে বিভ্রান্তিকর বিষয়গুলোর একটি। এই নিবন্ধটি ব্যাখ্যা করে এগুলো কীভাবে কাজ করে, জটিলতা কোথা থেকে আসে এবং সবচেয়ে সাধারণ ভুলগুলো কীভাবে এড়াবেন।
কেন টাইম জোন বিদ্যমান
পৃথিবী ২৪ ঘণ্টায় ৩৬০ ডিগ্রি ঘোরে, যার মানে আপনার দ্রাঘিমাংশের উপর নির্ভর করে সূর্য বিভিন্ন মুহূর্তে সর্বোচ্চ বিন্দুতে থাকে। ঊনবিংশ শতাব্দীর আগে, প্রতিটি শহর স্থানীয় সৌর সময়ে তাদের ঘড়ি সেট করত — দুপুর হতো যখন সূর্য মাথার উপরে থাকত। এটি ঠিক কাজ করত যতক্ষণ না রেলপথ দূরবর্তী শহরগুলোকে সংযুক্ত করল এবং একটি ট্রেন সময়সূচির একটি একক, সামঞ্জস্যপূর্ণ ঘড়ি প্রয়োজন হলো।
১৮৮৪ সালে, ২৫টি দেশের প্রতিনিধিরা ওয়াশিংটন, ডি.সি.-তে আন্তর্জাতিক মেরিডিয়ান সম্মেলনে মিলিত হয়ে পৃথিবীকে ২৪টি স্ট্যান্ডার্ড টাইম জোনে বিভক্ত করতে সম্মত হন, প্রতিটি ইংল্যান্ডের গ্রিনিচের মধ্য দিয়ে যাওয়া প্রাইম মেরিডিয়ান (০ ডিগ্রি দ্রাঘিমাংশ) থেকে অফসেট।
বাস্তবে, টাইম জোনের সীমানা রাজনৈতিক সীমানা অনুসরণ করে, পরিপাটি দ্রাঘিমাংশীয় রেখা নয়। চীন পাঁচটি ভৌগোলিক জোন জুড়ে বিস্তৃত কিন্তু একটি একক অফিসিয়াল সময় (UTC+8) ব্যবহার করে। ভারত UTC+5:30 ব্যবহার করে — আধা ঘণ্টার অফসেট। নেপাল UTC+5:45 ব্যবহার করে। টাইম জোনের বাস্তব মানচিত্র জটিল।
UTC বনাম GMT
GMT (Greenwich Mean Time) হলো গ্রিনিচের রয়্যাল অবজার্ভেটরিতে গড় সৌর সময়। এটি এক শতাব্দীরও বেশি সময় ধরে বিশ্বের সময় রেফারেন্স ছিল।
UTC (Coordinated Universal Time) ১৯৭২ সালে GMT-কে আন্তর্জাতিক স্ট্যান্ডার্ড হিসাবে প্রতিস্থাপন করে। UTC জ্যোতির্বিদ্যাগত পর্যবেক্ষণের পরিবর্তে পারমাণবিক ঘড়ির উপর ভিত্তি করে, এটিকে অনেক বেশি সুনির্দিষ্ট করে তোলে। বেশিরভাগ ব্যবহারিক উদ্দেশ্যে, UTC এবং GMT একই সময় দেখায়, কিন্তু UTC হলো সঠিক প্রযুক্তিগত রেফারেন্স।
কেন "UTC" এবং "CUT" নয়? সংক্ষেপণটি ইংরেজি "Coordinated Universal Time" (CUT) এবং ফরাসি "Temps Universel Coordonné" (TUC)-এর মধ্যে একটি আপোষ। কোনো পক্ষই তাদের পছন্দের সংক্ষেপণ পায়নি, তাই UTC একটি ভাষা-নিরপেক্ষ বিকল্প হিসাবে বেছে নেওয়া হয়েছিল।
ডেলাইট সেভিং টাইম: সংগঠিত বিশৃঙ্খলা
প্রায় ৭০টি দেশ ডেলাইট সেভিং টাইম (DST) পালন করে, বসন্তে ঘড়ি এক ঘণ্টা এগিয়ে এবং শরতে পিছিয়ে দেয়। উদ্দেশ্য হলো জাগ্রত ঘণ্টাগুলোকে দিনের আলোর সাথে সামঞ্জস্য করা। ফলাফল হলো ষাণ্মাসিক বাগের উৎস।
মূল জটিলতা:
- সর্বজনীন নয়। আফ্রিকা, এশিয়া এবং দক্ষিণ আমেরিকার বেশিরভাগই DST পালন করে না। মার্কিন যুক্তরাষ্ট্রের মধ্যে, অ্যারিজোনা এবং হাওয়াই বাদ পড়ে।
- ভিন্ন তারিখ। EU মার্চ এবং অক্টোবরের শেষ রবিবারে পরিবর্তন করে। US মার্চের দ্বিতীয় রবিবার এবং নভেম্বরের প্রথম রবিবারে পরিবর্তন করে। তারা প্রতি বছর কয়েক সপ্তাহ সিঙ্কের বাইরে থাকে।
- দ্ব্যর্থ সময়। যখন ঘড়ি পিছিয়ে যায়, সকাল ১:০০ থেকে ২:০০ পর্যন্ত ঘণ্টা দুবার ঘটে। সেই দিনে "১:৩০ AM"-এর একটি টাইমস্ট্যাম্প দ্ব্যর্থ।
- বাদ পড়া সময়। যখন ঘড়ি এগিয়ে যায়, সকাল ২:০০ থেকে ৩:০০ পর্যন্ত ঘণ্টা বিদ্যমান নেই। সেই দিনে সকাল ২:৩০-এ নির্ধারিত একটি মিটিং কখনো ঘটে না।
- রাজনৈতিক পরিবর্তন। সরকারগুলো সামান্য নোটিশে DST নিয়ম পরিবর্তন করতে পারে (এবং করে)। রাশিয়া ২০১১ সালে স্থায়ী DST গ্রহণ করে, তারপর ২০১৪ সালে স্থায়ী স্ট্যান্ডার্ড সময়ে পরিবর্তন করে। মরক্কো একাধিকবার DST নিয়ম পরিবর্তন করেছে।
ISO 8601: সর্বজনীন তারিখ ফরম্যাট
দ্ব্যর্থতা এড়াতে, আন্তর্জাতিক স্ট্যান্ডার্ড ISO 8601 একটি স্পষ্ট তারিখ এবং সময় ফরম্যাট নির্ধারণ করে:
2026-03-29T14:30:00Z
2026-03-29T14:30:00+02:00
2026-03-29T14:30:00-05:00
Tতারিখ এবং সময়কে পৃথক করে।Zমানে UTC (সামরিক পরিভাষায় "Zulu" টাইম জোন)।+02:00বা-05:00হলো UTC অফসেট।
এই ফরম্যাট দ্ব্যর্থহীন, প্লেইন টেক্সট হিসাবে সর্ট করা যায় এবং ডেট পার্সিং লাইব্রেরি দ্বারা সর্বজনীনভাবে বোঝা যায়। সন্দেহ হলে, ISO 8601 ব্যবহার করুন।
Unix টাইমস্ট্যাম্প
একটি Unix টাইমস্ট্যাম্প (epoch time বা POSIX time-ও বলা হয়) হলো ১ জানুয়ারি, ১৯৭০, ০০:০০:০০ UTC থেকে অতিবাহিত সেকেন্ডের সংখ্যা — একটি মুহূর্ত যা Unix epoch নামে পরিচিত।
| মানব-পাঠযোগ্য | Unix টাইমস্ট্যাম্প |
|---|---|
| 1970-01-01 00:00:00 UTC | 0 |
| 2000-01-01 00:00:00 UTC | 946684800 |
| 2026-03-29 12:00:00 UTC | 1774987200 |
Unix টাইমস্ট্যাম্পে কোনো টাইম জোন নেই — এগুলো সবসময় UTC-তে। এটি সফটওয়্যারে সময় সংরক্ষণ এবং তুলনা করার জন্য আদর্শ। আপনি শুধু ডিসপ্লে লেয়ারে স্থানীয় টাইম জোনে রূপান্তর করেন।
২০৩৮ সালের সমস্যা: যে সিস্টেমগুলো Unix টাইমস্ট্যাম্প ৩২-বিট সাইনড ইন্টিজার হিসাবে সংরক্ষণ করে সেগুলো ১৯ জানুয়ারি, ২০৩৮ তারিখে ০৩:১৪:০৭ UTC-তে ওভারফ্লো হবে। সর্বোচ্চ মান (২,১৪৭,৪৮৩,৬৪৭) একটি নেগেটিভ সংখ্যায় রোল ওভার করে, যা ডিসেম্বর ১৯০১ হিসাবে ব্যাখ্যা করা হয়। বেশিরভাগ আধুনিক সিস্টেম ৬৪-বিট ইন্টিজার ব্যবহার করে, যা আরও ২৯২ বিলিয়ন বছর ওভারফ্লো হবে না।
IANA টাইম জোন ডাটাবেস
সফটওয়্যারের শুধু UTC অফসেট নয় — প্রতিটি অঞ্চলের জন্য সম্পূর্ণ ইতিহাস এবং ভবিষ্যৎ নিয়ম জানা দরকার, DST ট্রানজিশন, রাজনৈতিক পরিবর্তন এবং ঐতিহাসিক ব্যতিক্রমসহ। এই তথ্য IANA Time Zone Database-এ (Olson database বা tzdata-ও বলা হয়) থাকে।
এটি America/New_York, Europe/Paris, Asia/Tokyo-এর মতো আইডেন্টিফায়ার ব্যবহার করে। প্রতিটি এন্ট্রি সেই অবস্থানের UTC অফসেট এবং DST নিয়মের সম্পূর্ণ ইতিহাস এনকোড করে।
এই কারণেই আপনার কখনোই টাইম জোন একটি নির্দিষ্ট অফসেট যেমন "+02:00" হিসাবে সংরক্ষণ করা উচিত নয়। একটি অফসেট আপনাকে UTC থেকে বর্তমান পার্থক্য বলে কিন্তু DST নিয়ম সম্পর্কে কিছুই বলে না। Europe/Paris শীতকালে UTC+1 এবং গ্রীষ্মকালে UTC+2। IANA আইডেন্টিফায়ার উভয়ই ক্যাপচার করে।
সফটওয়্যারের সাধারণ বাগ
- টাইম জোন ছাড়া স্থানীয় সময় সংরক্ষণ।
2026-03-29 14:30:00-এর মতো একটি মান কোন টাইম জোন উল্লেখ করছে তা না জানলে অর্থহীন। সবসময় UTC সংরক্ষণ করুন বা অফসেট অন্তর্ভুক্ত করুন। - ধরে নেওয়া UTC অফসেট মানে টাইম জোন। মার্চে UTC+2 জুলাইতে UTC+3 হতে পারে (যদি অঞ্চল DST পালন করে)। অফসেট নয়, IANA আইডেন্টিফায়ার সংরক্ষণ করুন।
- সময়সূচীতে DST ট্রানজিশন উপেক্ষা করা। সকাল ২:৩০-এ একটি দৈনিক কাজ বছরে একবার বাদ পড়বে এবং বছরে একবার দুবার চলবে যদি আপনি DST হ্যান্ডেল না করেন।
- ধরে নেওয়া দিনে ২৪ ঘণ্টা আছে। DST ট্রানজিশন দিনে, একটি দিনে ২৩ বা ২৫ ঘণ্টা থাকে। ৮৬,৪০০ সেকেন্ড যোগ করে "একই সময়ে আগামীকাল" গণনা করলে এক ঘণ্টা ভুল হবে।
- JavaScript
Dateনির্বোধভাবে ব্যবহার করা।new Date("2026-03-29")কিছু ইঞ্জিনে UTC হিসাবে এবং অন্যদের মধ্যে স্থানীয় সময় হিসাবে পার্স করা হয়। টাইম জোন সম্পর্কে সবসময় স্পষ্ট থাকুন।
ডেভেলপারদের জন্য সেরা অনুশীলন
- সময় UTC-তে সংরক্ষণ করুন। শুধু প্রেজেন্টেশন লেয়ারে ব্যবহারকারীর স্থানীয় টাইম জোনে রূপান্তর করুন।
- IANA টাইম জোন আইডেন্টিফায়ার ব্যবহার করুন (
America/New_York), নির্দিষ্ট অফসেট (-05:00) নয়। - সিরিয়ালাইজেশনের জন্য ISO 8601 ব্যবহার করুন। এটি দ্ব্যর্থহীন এবং সর্বজনীনভাবে পার্সযোগ্য।
- একটি পরিণত ডেট লাইব্রেরি ব্যবহার করুন। JavaScript-এ
Intl.DateTimeFormatবাdate-fns-tz-এর মতো লাইব্রেরি ব্যবহার করুন। Python-এzoneinfo(3.9+) বাpytzব্যবহার করুন। Java-তেjava.time.ZonedDateTimeব্যবহার করুন। tzdataআপডেট রাখুন। সরকারগুলো DST নিয়ম পরিবর্তন করে। আপনার অপারেটিং সিস্টেম এবং ভাষা রানটাইমে বর্তমান টাইমজোন ডেটা প্রয়োজন।- একাধিক টাইম জোনে টেস্ট করুন। ধরে নেবেন না যে আপনার সার্ভার এবং আপনার ব্যবহারকারীরা একই জোন শেয়ার করে।
আরও জানুন
সময় প্রতারণামূলকভাবে জটিল, কিন্তু নিয়মগুলো সুনথিভুক্ত এবং টুলগুলো পরিণত। মূল বিষয় হলো জটিলতাকে উপেক্ষা না করে সম্মান করা।
- Cron এক্সপ্রেশন রহস্যোদ্ঘাটন — টাইম জোন জুড়ে টাস্ক সময়সূচী করা
- Hash Generator এবং Regex Tester — ToolK-এ আরও ডেভেলপার টুল
