শিডিউলিং অ্যাপে টাইম জোন মিল নয় মিল না হওয়ার শীর্ষ কারণ। নিরাপদ ডেটা মডেল, রিকারিং নিয়ম, DST ফাঁদ ও ব্যবহারকারী-বান্ধব কপি শিখুন।

টাইম জোন ছোট গাণিতিক ভুলগুলোকে ভেঙে ফেলে বড় প্রতিশ্রুতি ভঙ্গ করে দেয়। একটি মিটিং যদি ১ ঘণ্টা বদলে যায়, সেটা "প্রায় সঠিক" বলে বিবেচিত হয় না। এতে কে উপস্থিত হবে, কে অপ্রস্তুত দেখায়, আর কে কিছু গুরুত্বপূর্ণ মিস করে—সবাই বদলে যায়। দু’বার ঘটলে ব্যবহারকারীরা ক্যালেন্ডারের উপর বিশ্বাস হারিয়ে ডাকচিঠি বা চ্যাটে সবকিছু যাচাই করা শুরু করে।
মূল সমস্যা হল মানুষ সময়কে আপেক্ষিকভাবে কটা মনে করে—তাদের কাছে সময় স্থির—কিন্তু সফটওয়্যারে তা স্থির নয়। মানুষ লোকাল ঘড়ির সময়ে ("সকাল ৯টা আমার সময়") ভাবে। কম্পিউটার প্রায়ই অফসেট দিয়ে ভাবে ("UTC+2") যা বছরের মধ্যে বদলে যেতে পারে। যখন আপনার অ্যাপ এই ধারণাগুলো মিশ্রণ করে, সেটা আজ সঠিক দেখালেও পরের মাসে ভুল দেখাতে পারে।
লক্ষণগুলোও এলোমেলো লাগে, যা বিষয়টিকে আরও খারাপ করে। ব্যবহারকারীরা রিপোর্ট করে যে মিটিংগুলো "হেঁটে যাচ্ছে" যদিও কেউ এডিট করেনি, রিমাইন্ডার দ্রুত বা দেরিতে বাজছে, সিরিজের কিছু ইনস্ট্যান্স এক ঘণ্টা সরে গেছে, ডিভাইস অনুযায়ী ইনভাইটগুলো ভিন্ন সময় দেখায়, বা ভ্রমণের পরে ডুপ্লিকেট ইভেন্ট দেখা দেয়।
সবচেয়ে ক্ষতিগ্রস্ত যারা—ওইসব যারা সবচেয়ে বেশি শিডিউলিংয়ের উপর নির্ভর করে: বিভিন্ন দেশে রিমোট টিম, সীমান্তপারি বুকিং করা কাস্টমার, এবং ভ্রমণকারী সবাই। একটি প্রোডাক্ট ম্যানেজার নিউ ইয়র্ক থেকে লন্ডনে উড়াল দিলেও তিনি আশা করবেন একটি ২:০০ PM মিটিং আর্কাইজড/অর্গানাইজারের টাইম জোনে ধরে রাখা হবে, আর ভ্রমণকারী তার লোকাল টাইম অনুসরণ করবে—উভয়ই যুক্তিযুক্ত প্রত্যাশা। কেবল একটি সত্য হতে পারে, তাই স্পষ্ট নিয়ম দরকার।
এটি কেবল ইভেন্ট কার্ডে যে সময় দেখাবেন তা নয়। টাইম জোন নিয়ম পুরো শিডিউলিং সারফেসে ছুঁয়েছে: একক ইভেন্ট, রিকারিং ইভেন্ট, রিমাইন্ডার, ইনভাইট ইমেইল এবং যেকোনো কিছু যা কোনো নির্দিষ্ট মুহূর্তে ট্রিগার করে। যদি আপনি প্রতিটির জন্য নিয়ম নির্ধারণ না করেন, আপনার ডেটা মডেল চুপচাপ সেটি নির্ধারণ করে দেবে, এবং ব্যবহারকারীরা কঠিনভাবে সেই নিয়ম জানতে পারবে।
একটি সরল উদাহরণ: মার্চে একটি সাপ্তাহিক "সোমবার সকাল ৯টা" স্ট্যান্ডআপ তৈরি করা হলো। এপ্রিল মাসে এক অংশগ্রহণকারীর অঞ্চলে DST বদলে গেল। যদি আপনার অ্যাপ এটিকে "প্রতিটি ৭ দিন একই UTC ইনস্ট্যান্টে" সংরক্ষণ করে, সেই অংশগ্রহণকারীর কাছে এটি হঠাৎ ১০:০০ AM হয়ে যাবে। যদি আপনার অ্যাপ এটিকে "আয়োজকের টাইম জোনে প্রতিটি সোমবার সকাল ৯টায়" সংরক্ষণ করে, তা ৯:০০ AM-এ থেকেই থাকে এবং UTC ইনস্ট্যান্ট পরিবর্তিত হয়। দুইটি পছন্দই কাজ করতে পারে, কিন্তু অ্যাপটি সুসংগত এবং খোলাখুলি হতে হবে।
বেশিরভাগ টাইম জোন বাগ কয়েকটি মৌলিক ধারণা একে অপরের সাথে গুলিয়ে ফেলায় ঘটে। শব্দগুলো ঠিক করলে UI কপিও স্পষ্ট হয়।
UTC (Coordinated Universal Time) হলো বিশ্বব্যাপী রেফারেন্স ক্লক। এটাকে ভাবুন এমন এক সিঙ্গেল টাইমলাইন হিসেবে যা সবাই শেয়ার করে।
একটি "অ্যাবসোলিউট টাইম" হলো টাইমলাইনের একটি নির্দিষ্ট মুহূর্ত, যেমন 2026-01-16 15:00:00 UTC। দুই ব্যক্তি যদি ভিন্ন দেশে সেই মুহূর্তটি দেখেন, তারা একই ইনস্ট্যান্ট দেখবেন, শুধু স্থানীয় ঘড়ি অনুযায়ী ভিন্নভাবে প্রদর্শিত হবে।
লোকাল টাইম হলো দেওয়ালের ঘড়িতে যা দেখা যায়, যেমন "সকাল ৯টা"। নিজের দ্বারা এটা কোনো মুহূর্ত নির্ধারণ করা পর্যাপ্ত নয়—একটি লোকেশনের নিয়ম দরকার।
অফসেট হলো UTC থেকে পার্থক্য কোনো মুহূর্তে, যেমন UTC+2 বা UTC-5। অনেক স্থানে বছরে অফসেট বদলে যায়, তাই শুধুমাত্র "UTC+2" সংরক্ষণ করা ঝুঁকিপূর্ণ।
টাইম জোন আইডি হলো বাস্তব নিয়ম সেট, সাধারণত IANA নাম যেমন America/New_York বা Europe/Berlin। আইডিগুলো জোনের ইতিহাস ও ভবিষ্যত পরিবর্তন (DST সহ) ধারণ করে।
প্রায়োগিক পার্থক্য:
America/New_York (জানেই কখন এটা UTC-4 হবে)DST হলো যখন কোনো অঞ্চল সাধারণত এক ঘন্টার জন্য ঘড়ি এগিয়ে বা পিছিয়ে দেয়। এর মানে UTC অফসেট বদলে যায়।
DST-এর দুইটি অপ্রত্যাশ্যতা:
ওয়াল-ক্লক টাইম হলো ব্যবহারকারীরা যা টাইপ করে: "প্রতি সোমবার সকাল ৯টা"। অ্যাবসোলিউট টাইম হলো আপনার সিস্টেম যা কার্যকর করবে: "এই নির্দিষ্ট UTC মুহূর্তে রিমাইন্ডার পাঠান"। রিকারিং ইভেন্ট প্রায়ই ওয়াল-ক্লক নিয়ম হিসেবে শুরু হয়, পরে তা অ্যাবসোলিউট ইনস্ট্যান্সগুলোর সিরিজে রূপান্তরিত হয়।
ব্যবহারকারীরা মনে করে তারা "আমার টাইম জোনে ৯:০০ AM" বুক করেছিল। আপনার ডেটাবেজ হয়তো সংরক্ষণ করে 2026-03-10 13:00 UTC। দুটোই সঠিক হতে পারে, কিন্তু শুধুমাত্র যদি আপনি কোন টাইম জোন নিয়মগুলি উদ্দেশ্য ছিল তা মনে রাখেন।
ডিভাইসগুলিও টাইম জোন পরিবর্তন করে। মানুষ ভ্রমণ করে, এবং ল্যাপটপ অটো-সুইচ করতে পারে। যদি আপনার অ্যাপ চুপচাপ সংরক্ষিত "9:00 AM"-কে ডিভাইসের নতুন জোনে পুনঃবস্তু করে, ব্যবহারকারীরা অনুভব করবেন যে মিটিং "হেঁটে গেছে" যদিও তারা কিছু করেনি।
বেশিরভাগ "আমার মিটিং সরল" বাগগুলোই ডেটা মডেল বাগ। এককালীন ইভেন্টগুলোর জন্য সবচেয়ে নিরাপদ ডিফল্ট হলো: একটি সিঙ্গেল ইনস্ট্যান্ট UTC-তে সংরক্ষণ করুন, এবং দেখানোর সময় ব্যবহারকারীর লোকাল টাইমে রূপান্তর করুন।
একটি এককালীন ইভেন্ট হলো যেমন "Oct 12, 2026 at 15:00 in Berlin." সেই মুহূর্ত একবারই ঘটে। যদি আপনি এটিকে UTC (টাইমলাইনের একটি ইনস্ট্যান্ট) হিসেবে সংরক্ষণ করেন, তা সবসময় একই মুহূর্তকে ম্যাপ করবে, দর্শক যেখানে থাকুক না কেন।
শুধুমাত্র লোকাল টাইম (যেমন "15:00") সংরক্ষণ করা ভাঙে যদি কেউ অন্য টাইম জোন থেকে দেখেন, বা ক্রাইটেরিয়ার ডিভাইস সেটিং পরিবর্তন করেন। কেবল অফসেট (যেমন "+02:00") সংরক্ষণ করাও পরে ভাঙে কারণ অফসেট DST-র সাথে বদলে যায়। "+02:00" কোনো স্থান নয়, এটা কেবল সাময়িক নিয়ম।
কখন টাইম জোন আইডি সহ UTC সংরক্ষণ করবেন? যখনই আপনি গুরুত্ব দেন যে নির্মাতার মানে কী ছিল, শুধু কোন ইনস্ট্যান্ট সংরক্ষিত হল না। Europe/Berlin মত জোন আইডি ডিসপ্লে, অডিট এবং সাপোর্টে সহায়ক, এবং এটি রিকারিং ইভেন্টের জন্য অপরিহার্য হয়ে ওঠে। এটি আপনাকে বলতে দেয়: "এই ইভেন্ট 15:00 Berlin টাইম হিসেবে তৈরি করা হয়েছিল," এমনকি যদি পরবর্তীতে Berlin-এর অফসেট বদলে যায়।
একটি ব্যবহারিক রেকর্ড এককালীন ইভেন্টের জন্য সাধারণত অন্তর্ভুক্ত করে:
start_at_utc (এবং end_at_utc)created_at_utccreator_time_zone_id (IANA নাম)original_input (ব্যবহারকারী কি টাইপ করেছে তার টেক্সট বা ফিল্ড)input_offset_minutes (ঐচ্ছিক, ডিবাগিংয়ের জন্য)সাপোর্টের জন্য, এই ক্ষেত্রগুলো একটি অস্পষ্ট অভিযোগকে স্পষ্ট রিপ্লেতে পরিণত করে: ব্যবহারকারী কি টাইপ করেছিল, তাদের ডিভাইস কোন জোনটি দাবি করেছিল, এবং আপনার সিস্টেম কি ইনস্ট্যান্ট সংরক্ষণ করেছিল।
রূপান্তর কোথায় ঘটে সে ব্যাপারে কঠোর থাকুন। স্টোরেজের জন্য সার্ভারকে সত্যের উৎস হিসেবে বিবেচনা করুন (শুধুমাত্র UTC), এবং ক্লায়েন্টকে উদ্দেশ্যের উৎস হিসেবে বিবেচনা করুন (লোকাল টাইম প্লাস টাইম জোন আইডি)। লোকাল টাইমকে UTC তে একবার রূপান্তর করুন—সৃষ্টি বা এডিট সময়েই—এবং পরে স্টোর করা UTC-কে পুনরায় "রিকনভার্ট" করবেন না। শান্ত শিফটগুলো প্রায়ই ঘটে যখন ক্লায়েন্ট এবং সার্ভার উভয়েই রূপান্তর প্রয়োগ করে, বা যখন একপক্ষ অনুমান করে টাইম জোন ব্যবহার করার বদলে।
যদি আপনি একাধিক ক্লায়েন্ট থেকে ইভেন্ট গ্রহণ করেন, টাইম জোন আইডি লগ করুন এবং যাচাই করুন। যদি এটি অনুপস্থিত থাকে, অনুমান করার বদলে ব্যবহারকারীকে এটি বেছে নিতে বলুন। এই ছোটটা প্রম্পট পরে অনেক রাগান্বিত টিকিট রোধ করে।
যখন ব্যবহারকারীরা বারবার টাইম "হেঁটে যাচ্ছে" দেখে, সাধারণত সেটি সিস্টেমের বিভিন্ন অংশে ভিন্নভাবে রূপান্তর হওয়ার কারণেই হয়।
কোনো একটি জায়গাকে রূপান্তরের সত্যের উৎস বানান। অনেক দল সার্ভারকে বেছে নেয় কারণ এটি ওয়েব, মোবাইল, ইমেইল এবং ব্যাকগ্রাউন্ড জবগুলোর জন্য সেম ফলাফল গ্যারান্টি করে। ক্লায়েন্ট প্রিভিউ দেখাতে পারে, কিন্তু সার্ভারই চূড়ান্ত স্টোর করা মান নিশ্চিত করা উচিত।
একটি পুনরাবৃত্তি যোগ্য পাইপলাইন বেশিরভাগ বিস্ময় এড়ায়:
2026-03-10 09:00) এবং ইভেন্ট টাইম জোনটি একটি IANA নাম হিসেবে নিন (America/New_York), সংক্ষিপ্ত রূপ যেমন "EST" ব্যবহার করবেন না।উদাহরণ: নিউ ইয়র্কের একটি হোস্ট "Tue 9:00 AM (America/New_York)" তৈরি করলে, বার্লিনে থাকা একটি টীমমেট সেটি দেখবে "3:00 PM (Europe/Berlin)" কারণ একই UTC ইনস্ট্যান্ট তাদের জোনে ব্যাখ্যা করা হয়েছে।
অল-ডে মানে "00:00 UTC থেকে 00:00 UTC" নয়। সাধারণত এটি নির্দিষ্ট একটি টাইম জোনে একটি তারিখের পরিধি। অল-ডে হিসেবে start_date, end_date এবং সেই তারিখ ব্যাখ্যার জন্য ব্যবহৃত জোন সংরক্ষণ করুন। নতুবা, একটি অল-ডে ইভেন্ট UTC-এর কারণে পশ্চিম দিকের ইউজারদের কাছে আগের দিন শুরু হয়ে দেখা দিতে পারে।
শিপিংয়ের আগে বাস্তব-বিশ্ব কেস পরীক্ষা করুন: একটি ইভেন্ট তৈরি করুন, ডিভাইস টাইম জোন পরিবর্তন করুন, তারপর আবার খুলুন। ইভেন্টটি এখনও সেই একই মুহূর্ত (টাইমড ইভেন্টের ক্ষেত্রে) বা সেই একই লোকাল তারিখ (অল-ডে ইভেন্টের ক্ষেত্রে) উপস্থাপন করা উচিত—চুপচাপ সরে যাওয়া নয়।
বেশিরভাগ শিডিউলিং বাগ তখনই দেখায় যখন একটি ইভেন্ট পুনরাবৃত্তি করে। প্রচলিত ভুল হল রিকারেন্সকে "শুধু সামনের দিকে তারিখ অনুলিপি" হিসেবে দেখা। প্রথমে সিদ্ধান্ত নিন ইভেন্টটি কোথায় অ্যাঙ্করড:
বেশিরভাগ ক্যালেন্ডারের জন্য (মিটিং, রিমাইন্ডার, অফিস আওয়ার), ব্যবহারকারীরা ওয়াল-টাইম আশা করে। "প্রতি সোমবার সকাল ৯টা" সাধারণত ওই শহরের ৯টা বোঝায়, না যে "চিরকাল একই UTC মুহূর্তে"।
রিকারেন্সকে প্রি-জেনারেট করা টাইমস্ট্যাম্পের তালিকা হিসেবে নয়, একটি নিয়ম এবং তা ব্যাখ্যা করতে যে কনটেক্সট দরকার তা সংরক্ষণ করুন:
এটি আপনাকে DST ছাড়াই পরিচালনা করতে সাহায্য করে, এবং এডিটগুলোকে পূর্বানুমানযোগ্য করে তোলে।
যখন একটি তারিখ রেঞ্জের জন্য ইভেন্ট দরকার, ইভেন্টের জোনে লোকাল টাইমে জেনারেট করুন, তারপর প্রতিটি ইনস্ট্যান্সকে তুলনা বা স্টোর করার জন্য UTC-তে রূপান্তর করুন। মূল বিষয় হলো লোকাল টার্মসে "এক সপ্তাহ যোগ করা" বা "পরবর্তী সোমবার" করা, UTC-তে "+ 7 * 24 ঘন্টা" যোগ করা নয়।
সরল মানসিক পরীক্ষা: ব্যবহারকারী যদি বার্লিনে সাপ্তাহিক 9:00 AM বেছে নেন, প্রতিটি জেনারেট হওয়া ইনস্ট্যান্সই বার্লিনে 9:00 AM হওয়া উচিত। Berlin যখন DST পরিবর্তন করবে UTC মান বদলে যাবে, এবং সেটাই সঠিক।
ভ্রমণের সময় ব্যবহারকারীরা থাকলে আচরণ স্পষ্ট করুন। একটি বার্লিন-অ্যাঙ্করড ইভেন্ট এখনও বার্লিনে 9:00 AM-এ হবে, এবং নিউ ইয়র্কের কেউ সেটি তার লোকাল টাইমে কনভার্টেড হিসেবে দেখবে। যদি আপনি এমন "ফ্লোটিং" ইভেন্ট সমর্থন করেন যা দর্শকের বর্তমান টাইম জোন অনুসরণ করে, তা স্পষ্টভাবে লেবেল করুন—এটা দরকারী, কিন্তু লোকেরা অবাক হয় যখন এটা উল্লেখ না করা থাকে।
DST সমস্যা ব্যবহারকারীর কাছে এলোমেলো মনে হয় কারণ অ্যাপ বুকিং করার সময় এক সময় দেখায় এবং পরে অন্য সময় দেখায়। সমাধান কেবল প্রযুক্তিগত নয়—স্পষ্ট নিয়ম ও স্পষ্ট শব্দও দরকার।
ঘড়ি বসন্তে এগোলে কিছু লোকাল টাইম অস্তিত্বই হারায়। ক্লাসিক উদাহরণ হল DST শুরু দিনে 02:30। যদি আপনি কাউকে এটি বেছে নিতে দেন, আপনাকে সিদ্ধান্ত নিতে হবে এর মানে কী।
শরতে ঘড়ি পিছোলে বিপরীতটা ঘটে: একই লোকাল টাইম দুইবার ঘটে। "01:30" প্রথম অথবা দ্বিতীয়টি হতে পারে। আপনি না জেনে থাকলে অনুমান করছেন, এবং মানুষ যোগ দেওয়ার সময় এক ঘণ্টা আগে বা পরে আসলে তা লক্ষ্য করবে।
আচরণগত নিয়ম যা বিস্ময় রোধ করে:
একটি বাস্তবসম্মত সাপোর্ট টিকিট শুরু: কেউ আগামী মাসে নিউ ইয়র্কে "02:30" বুক করে, তারপর সেই দিন এসে অ্যাপ চুপচাপ "03:30" দেখায়। সৃষ্টির সময় ভাল কপি সহজ: "Mar 10-এ ঘড়ি পরিবর্তনের কারণে এই সময়টি উপলব্ধ নেই। 01:30 বা 03:00 বেছে নিন।" যদি আপনি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করেন, বলুন: "আমরা এটি 03:00-এ সরিয়ে দিয়েছি কারণ Mar 10-এ 02:30 অনুপস্থিত।"
আপনি যদি DST-কে UI এজ কেস হিসেবে মানেন, তা বিশ্বাস সমস্যা হিসেবে ফিরে আসে। যদি এটিকে প্রোডাক্ট নিয়ম হিসেবে নেন, তা পূর্বানুমানযোগ্য হয়ে ওঠে।
বেশিরভাগ রাগান্বিত টিকিট কয়েকটি পুনরাবৃত্ত ভুল থেকে আসে। অ্যাপটি যেন "টাইম পরিবর্তন করছে" তেমন লাগে, কিন্তু আসল সমস্যা হলো ডেটা, কোড এবং কপিতে নিয়মগুলো কখনও স্পষ্ট করা হয়নি।
একটি সাধারণ ব্যর্থতা হল কেবল একটি অফসেট (যেমন -05:00) সংরক্ষণ করা, প্রকৃত IANA টাইম জোন (America/New_York) নয়। অফসেটগুলো DST শুরু বা শেষ হলে বদলে যায়, তাই মার্চে সঠিক দেখানো কোনো ইভেন্ট নভেম্বরের মধ্যে ভুল হয়ে যেতে পারে।
টাইম জোন সঙ্কেতিবচনাও (abbreviations) বারবার বাগের কারণ। "EST" বিভিন্ন মানুষের কাছে ভিন্ন মানে থাকতে পারে এবং কিছু প্ল্যাটফর্ম সংক্ষিপ্ত রূপগুলো অসম্পূর্ণ মানচিত্র করে। ফুল টাইম জোন আইডি স্টোর করুন এবং সংক্ষিপ্ত রূপগুলো যদি দেখান সেটি কেবল ডিসপ্লে-ওয়াই করুন।
অল-ডে ইভেন্টগুলো আলাদা ক্যাটাগরি। যদি আপনি অল-ডে ইভেন্টকে "মধ্যরাত UTC" হিসেবে সংরক্ষণ করেন, নেতিবাচক অফসেটে থাকা ব্যবহারকারীরা প্রায়ই এটি আগের দিন শুরু দেখবে। অল-ডে হিসেবে ডেট ও ব্যবহৃত জোন সংরক্ষণ করুন।
কোড রিভিউয়ের জন্য একটি ছোট চেকলিস্ট:
00:00 UTC) হিসেবে সংরক্ষণ করবেন না।রিমাইন্ডার ও ইনভাইট ভুল হতে পারে এমনকি যদি ইভেন্ট স্টোরেজ ঠিক থাকে। উদাহরণ: কেউ "Berlin time-এ 9:00 AM" তৈরি করে এবং 8:45 AM Berlin-এ রিমাইন্ডার আশা করে। যদি আপনার জব শেডিউলার UTC-তে চলে এবং আপনি ভুলবশত "8:45"-কে সার্ভারের লোকাল টাইম হিসেবে গণ্য করেন, রিমাইন্ডারগুলো আগে বা পরে বাজতে পারে।
ক্রস-প্ল্যাটফর্ম পার্থক্যগুলো এটিকে আরও খারাপ করে। একটি ক্লায়েন্ট দ্ব্যর্থবোধক সময়কে ডিভাইস জোন ব্যবহার করে ব্যাখ্যা করতে পারে, আরেকটি ইভেন্ট জোন ব্যবহার করে, তৃতীয়টি ক্যাশ করা DST নিয়ম প্রয়োগ করে। যদি আপনি কনসিস্টেন্ট আচরণ চান, কনভার্সন ও রিকারেন্স এক্সপ্যানশন এক জায়গায় (সাধারণত সার্ভার) রাখুন যাতে প্রতিটি ক্লায়েন্ট একই ফল পায়।
একটি সরল স্যানিটি টেস্ট: DST পরিবর্তনের সপ্তাহে একটি ইভেন্ট তৈরি করুন, দুইটি ডিভাইসে দেখুন যেগুলো ভিন্ন জোনে সেট করা আছে, এবং নিশ্চিত করুন স্টার্ট টাইম, তারিখ এবং রিমাইন্ডার টাইম সবগুলোই আপনি ব্যবহারকারীদের প্রতিশ্রুতি দিয়েছেন সেই রুলের সাথে মেলে।
বেশিরভাগ টাইম জোন বাগ ডেভেলপমেন্টে বাগের মতো দেখায় না। এগুলো তখনই আসে যখন কেউ ভ্রমণ করে, DST ফ্লিপ করে, বা দুইজন মানুষ স্ক্রিনশট তুলে তুলনা করে।
আপনার ডেটা মডেলটি কোন ধরনের সময় মোকাবিলা করছে তা মেলে কিনা নিশ্চিত করুন। এককালীন ইভেন্ট একটি বাস্তব মুহূর্ত সংরক্ষণ করে। রিকারিং ইভেন্ট একটি স্থানের সাথে যুক্ত নিয়ম চায়।
America/New_York ইত্যাদি) সংরক্ষণ করুন, কেবল অফসেট নয়।2026-01-16T14:00Z) এর মধ্যে পরিষ্কার পার্থক্য রাখুন।DST দুই বিপজ্জনক মুহূর্ত তৈরি করে: অস্তিত্বহীন সময় (spring forward) এবং দ্ব্যর্থবোধক সময় (fall back)। আপনার অ্যাপ কী করবে তা ঠিক করুন, এবং সেটি ধারাবাহিকভাবে করুন।
পরীক্ষার দৃশ্য: বার্লিনে "সাপ্তাহিক সোমবার 09:00"। ইউজার নিউ ইয়র্কে এই মিটিং দেখতে কীভাবে সময় বদলায় তা DST-এর আগে ও পরে, এবং ইউএসের DST বদলানোর পরে পরীক্ষা করুন (তারা ভিন্ন তারিখে পরিবর্তন করে)।
অনেক রাগান্বিত টিকিট UI যে টাইম জোন লুকায় সেটার জন্য আসে। মানুষ তাদের ইচ্ছেমত ধরে নেয়।
শুধুমাত্র আপনার ল্যাপটপের টাইম জোন ও এক লকেলের ফরম্যাটে নির্ভর করবেন না।
লন্ডনে থাকা একজন ফাউন্ডার নিউ ইয়র্কে থাকা টীমমেটের সাথে সাপ্তাহিক স্ট্যান্ডআপ নির্ধারণ করেন। তারা বেছে নেন "মঙ্গলবার 10:00" এবং আশা করে এটি লন্ডনের জন্য সকালের মতো এবং নিউ ইয়র্কের জন্য ভোরের মতো থাকবে।
একটি নিরাপদ সেটআপ হলো মিটিংটিকে "Europe/London-এ প্রতি মঙ্গলবার 10:00" হিসেবে বিবেচনা করা; প্রতিটি ইনস্ট্যান্স লন্ডন টাইমে জেনারেট করা, ঐ ইনস্ট্যান্সের বাস্তব UTC ইনস্ট্যান্ট সেভ করা, এবং প্রত্যেক দর্শকের লোকাল সময়ে তা ডিসপ্লে করা।
বসন্তের DST গ্যাপের সময়, যুক্তরাষ্ট্র UK-এর আগে ঘড়ি পরিবর্তন করে:
অর্গানাইজারের কাছে কিছুই "হেঁটে" যায়নি। মিটিং লন্ডন টাইমে 10:00-এ থেকেই আছে। একমাত্র পরিবর্তন হলো নিউ ইয়র্কের অফসেট কয়েক সপ্তাহের জন্য বদলে গেছে।
রিমাইন্ডারগুলো প্রত্যেক ব্যক্তির দেখায় যা অনুযায়ী হওয়া উচিত, না যে তারা "আগে যা দেখত"। যদি নিউ ইয়র্ক টীমমেটের 15-মিনিট রিমাইন্ডার থাকে, সেটা US পরিবর্তনের আগে 05:45-এ বাজবে, গ্যাপ সপ্তাহগুলিতে 06:45-এ বাজবে—কেউ ইভেন্ট এডিট না করলেও।
এখন একটি এডিট যোগ করুন: দুইটা কঠোর সকালের পরে লন্ডন অর্গানাইজার স্ট্যান্ডআপ পরিবর্তন করে 10:30 লন্ডন থেকে শুরু করে। একটি ভাল সিস্টেম অর্গানাইজারের টাইম জোনে পরিবর্তন প্রয়োগ করে, ভবিষ্যত ইনস্ট্যান্সগুলোর জন্য নতুন UTC ইনস্ট্যান্ট জেনারেট করে, এবং অতীত ইনস্ট্যান্সগুলো যেগুলো ছিল সেগুলো অপরিবর্তিত রাখে।
ভাল কপি সাপোর্ট টিকিট কমায়: "প্রতি মঙ্গলবার 10:00 (London time) পুনরাবৃত্তি হয়। আমন্ত্রিতরা তাদের লোকাল টাইমে দেখবে। ডে লাইট সেভিং শুরু বা শেষ হলে সময় 1 ঘন্টা বদলে যেতে পারে।"
বেশিরভাগ "টাইম জোন বাগ" আসলে প্রত্যাশার বাগ। আপনার ডেটা মডেল সঠিক হতে পারে, কিন্তু যদি UI কপি অস্পষ্ট হয়, মানুষ ধরে নেয় অ্যাপ তাদের মন পড়বে। টাইম জোনকে ব্যাকএন্ড ডিটেল নয়—একটি UX প্রতিশ্রুতি হিসেবে বিবেচনা করুন।
যেখানে টাইম UI-এর বাইরে দেখা যায় (নোটিফিকেশন, ইমেইল), সেখান টাইম জোন নামই রাখুন। কেবল "10:00 AM"-এর উপর নির্ভর করবেন না। জোন পাশাপাশি দেখান এবং ফরম্যাট ধারাবাহিক রাখুন।
বিভিন্ন কপি প্যাটার্ন যা বিভ্রান্তি কমায়:
DST দিনের জন্য বন্ধুত্বপূর্ণ ত্রুটি বার্তা দরকার। যদি ব্যবহারকারী এমন একটি সময় বেছে নেয় যা অস্তিত্ব নেই (যেমন spring-forward রাতে 2:30 AM), প্রযুক্তিগত ভাষা ত্যাগ করে অপশন দিন: "Mar 10-এ 2:30 AM উপলব্ধ নেই কারণ ঘড়ি এগোয়। 1:30 AM বা 3:30 AM বেছে নিন।" যদি একটি সময় দুইবার ঘটে (fall-back), সোজা জিজ্ঞেস করুন: "আপনি কি প্রথম 1:30 AM বোঝাতে চান না দ্বিতীয়?"
নিরাপদভাবে বানানোর জন্য পুরো ফ্লো (create, invite, view in another zone, edit after DST) প্রোটোটাইপ করুন:
যদি দ্রুত কোনো শিডিউলিং ফিচার বানানো দরকার হয়, Koder.ai-এর মত চ্যাট-টু-অ্যাপ প্ল্যাটফর্ম আপনাকে নিয়ম, স্কিমা এবং UI একসাথে দ্রুত ইটারেট করতে সাহায্য করতে পারে। গতি মহান, তবে একই শৃঙ্খল প্রযোজ্য: ইনস্ট্যান্ট UTC-তে সংরক্ষণ করুন, ইভেন্টের উদ্দেশ্যের জন্য IANA টাইম জোন রাখুন, এবং সবসময় ব্যবহারকারীদের দেখান তারা কোন টাইম জোন দেখছে।