چرا اپلیکیشن ساختهشده با هوش مصنوعی زمان اشتباه نشان میدهد (و چطور مشکل منطقه زمانی را حل کنیم)
وقتی اپلیکیشنی بهجای یک لحظهی مشخص، فقط عدد ساعت را ذخیره میکند، یا بهجای زمان کاربر، زمان سرور را نمایش میدهد، یا تغییرات ساعت تابستانی/زمستانی را نادیده میگیرد، زمان اشتباه نشان میدهد — دلیل خاموشی که پشت نوبتهای دوبار رزرو شده و یادآوریهای ساعت ۲ بامداد پنهان است.
چرا یک اپلیکیشن ساختهشده با هوش مصنوعی زمان اشتباه نشان میدهد؟
چون دو نفر در دو نقطهی متفاوت میتوانند هر دو به زمان درست نگاه کنند و در عین حال دو عدد متفاوت ببینند — این ناهماهنگی، خلاصهی کل مسئلهی منطقهی زمانی است. مشتریای در مادرید نوبت ساعت ۳ بعدازظهر شما را رزرو میکند؛ شما در مکزیکوسیتی هستید و صفحهی شما همان رزرو را ساعت ۸ صبح نشان میدهد. به آن خیره میشوید و مطمئنید که چیزی خراب شده.
هیچچیز خراب نشده. در همان لحظهی دقیق، در مادرید ساعت ۳ بعدازظهر است و در مکزیکوسیتی ساعت ۸ صبح. هر دوی شما درست میگویید. همین شکاف — جایی که دو نفر درستگو دو عدد متفاوت میبینند — پشت تعداد شگفتانگیزی از گزارشهای «اپلیکیشنم رفتار عجیبی دارد» پنهان است.
این مشکل یواشکی سراغتان میآید، چون در زمان ساخت و تست، شما تنها فردی هستید که، در یک مکان، روی یک دستگاه کار میکند. همهچیز جور در میآید. منطقههای زمانی فقط وقتی دندان نشان میدهند که یک نفر دیگر، در جایی دیگر، به همان زمان نگاه کند. اگر اپلیکیشن شما کاربرانی در بیش از یک شهر دارد — یا هر نوع پیام زمانبندیشدهای میفرستد — این مشکل به سراغتان خواهد آمد. بهتر است از قبل و عمداً با آن روبهرو شوید.
دقیقاً منطقهی زمانی چیست؟
منطقهی زمانی نیمهی «مکان»ِ زمان است — بخشی که یک لحظهی جهانی را به عددی روی ساعت محلی تبدیل میکند. این یک ایده به همهچیز معنا میدهد: هر زمان دو بخش دارد.
۱. لحظه — یک آن مشخص که در همهجای زمین یکسان است. ۲. مکان — جایی که در آن ساعت را میخوانید.
«ساعت ۳ بعدازظهر» بهتنهایی هیچ معنایی ندارد. ساعت ۳ بعدازظهر کجا؟ کامپیوترها این مسئله را با ذخیرهی لحظه در قالبی خنثی و بدون مکان حل میکنند (شنیدهاید که سازندهتان میگوید «UTC» — آن را مثل ساعتِ یک نقطهی مرجع ثابت در نظر بگیرید)، و سپس هنگام نمایش، آن را به زمان محلی هر شخص تبدیل میکنند.
وقتی اپلیکیشنی زمان اشتباه نشان میدهد، تقریباً همیشه به این خاطر است که ردِ یکی از این دو بخش را گم کرده — یا مکان را فراموش کرده، یا از همان اول لحظهی واقعی را ذخیره نکرده است.
چه چیزی باعث باگهای منطقهی زمانی در اپلیکیشنها میشود؟
سه اشتباه مشخص پشت تقریباً همهی باگهای منطقهی زمانی است: ذخیرهی عدد ساعت بهجای لحظهی واقعی، نمایش زمان سرور بهجای زمان کاربر، و نادیده گرفتن تغییرات ساعت تابستانی.
۱. اپلیکیشن عدد ساعت را ذخیره میکند، نه یک لحظهی واقعی را. کسی «ساعت ۹ صبح» را انتخاب میکند و اپلیکیشن متن «۹ صبح» را بدون هیچ مکانی ذخیره میکند. حالا این اپلیکیشن «۹ صبح» را به همه، در همهجا، نشان میدهد که گاهی همان چیزی است که میخواهید (یک یادآوری دارو که باید ساعت ۹ صبحِ محلیِ هر فرد فعال شود) و گاهی یک فاجعه (یک وبینار زنده که باید در یک لحظهی مشترک برای همه شروع شود). اگر اپلیکیشن حدس اشتباهی دربارهی منظور شما بزند، زمان جابهجا میشود.
۲. اپلیکیشن زمان سرور را نشان میدهد، نه زمان کاربر را. اپلیکیشن شما روی کامپیوتری در یک دیتاسنتر اجرا میشود — مثلاً در ویرجینیا. اگر کسی چیز دیگری به آن نگفته باشد، با کمال میل زمان ویرجینیا را به همه نشان میدهد. کاربران شما در لندن حالا یک بعدازظهر عقبتر هستند و اصلاً نمیدانند چرا.
۳. ساعت تابستانی ساعتها را جابهجا میکند و اپلیکیشن شما متوجه نمیشود. دو بار در سال، بسیاری از مناطق ساعت خود را یک ساعت جابهجا میکنند. جلسهی تکرارشوندهای که برای «هر سهشنبه ساعت ۹ صبح» تنظیم کردهاید و در زمستان درست کار میکرده، در تابستان ناگهان ساعت ۸ یا ۱۰ میافتد، اگر اپلیکیشن بهجای یک مکان، به یک اختلاف زمانی ثابت قفل شده باشد.
سه نمونهی واقعی از این ماجرا
رویدادی که سه بار شروع شد. یک بنیانگذار برای یک کارگاه آنلاین صفحهای ساده ساخت که فقط یک زمان شروع رویش نوشته شده بود: «شروع: ساعت ۶ عصر.» شرکتکنندگان در سه کشور مختلف، هرکدام «۶ عصر» را بهعنوان ساعت ۶ عصرِ محلی خودشان خواندند. یکسوم آنها یک ساعت دیر پیوستند، عدهای یک ساعت زود پیوستند، و همه لینک را مقصر دانستند. راهحل، لینک بهتر نبود — نشان دادن ساعت شروعِ محلیِ خودِ هر فرد بود، همراه با نام منطقهی زمانی.
خبرنامهای که ساعت ۲ بامداد رسید. ایمیلی با تنظیم «هر روز صبح ساعت ۸ بفرست» دقیقاً ساعت ۸ صبح به وقت سرور ارسال میشد. برای نیمهی اروپاییِ فهرست مخاطبان، آن ساعت وسط شب بود. نرخ باز شدن ایمیل برای آن مشترکین بهشدت پایین بود و بهنظر میرسید مشکل از محتواست. اما مشکل از منطقهی زمانی بود.
یکشنبهای که دو بار رزرو شد. یک اپلیکیشن نوبتدهی به دو نفر اجازه داد یک نوبت ماساژ را در همان شبی رزرو کنند که ساعتها «یک ساعت عقب» رفتند، چون ساعت ۱:۳۰ بامداد آن شب دو بار اتفاق افتاد و اپلیکیشن هر دو را یک لحظهی واحد در نظر گرفت. نادر است، اما از آن باگهایی است که یک مشتری واقعی و یک عذرخواهی واقعی برایتان هزینه دارد.
از سازندهی خود چه بخواهید تا مشکل منطقهی زمانی را رفع کند؟
چهار چیز مشخص را با زبانی ساده بخواهید — لازم نیست هیچکدام از اینها را با جزئیات یاد بگیرید. اینها را کپی کنید:
«هر زمانی را بهصورت یک لحظهی UTC ذخیره کن، و منطقهی زمانی هر کاربر را هم جداگانه ذخیره کن.»
«وقتی زمانی را نمایش میدهی، آن را در منطقهی زمانی بیننده نشان بده، و نام منطقه را دقیقاً کنارش بگذار — مثل
3:00 PM (به وقت شما)یا3:00 PM CST.»
«برای هر چیزی که تکرار میشود — یادآوریها، برنامهها، رویدادهای تکرارشونده — آن را به یک مکان (مثل ‘America/Mexico_City’) وصل کن، نه به یک عدد ثابت از ساعت، تا ساعت تابستانی بهطور خودکار مدیریت شود.»
«بگذار طوری تستش کنم که انگار در کشوری دیگر هستم.»
آن مورد آخر، بیش از آنچه بهنظر میرسد اهمیت دارد، و این ما را به بخشی میرساند که خودتان میتوانید انجام دهید.
چطور اپلیکیشن خود را برای باگهای منطقهی زمانی تست کنید؟
میتوانید بیشتر باگهای منطقهی زمانی را در دو دقیقه، بدون نیاز به یک کاربر واقعی در کشوری دیگر، پیدا کنید — فقط وانمود کنید که آنجا هستید:
۱. تنظیمات تاریخ و ساعت گوشی یا کامپیوترتان را باز کنید و منطقهی زمانی را به جایی دور تغییر دهید — توکیو، لندن، هرجا. ۲. اپلیکیشن خود را دوباره بارگذاری کنید. ۳. به هر جایی که زمانی نشان داده میشود نگاه کنید. هنوز منطقی بهنظر میرسد؟ میگوید زمانِ چه کسی است؟
اگر رزروی که باید ساعت ۳ بعدازظهر باشد حالا بدون هیچ توضیحی ساعت ۴ بامداد نشان میدهد، باگ را پیش از مشتری پیدا کردهاید. وقتی کارتان تمام شد، تنظیمات را به حالت اول برگردانید. برای حالتهای یادآوری تکرارشونده و ساعت تابستانی، مطمئنترین راه این است که از یک دوست در کشوری دیگر بخواهید به یک تاریخ مشخص نگاه کند و بگوید چه ساعتی میبیند.
اصلاً لازم است نگران منطقهی زمانی باشید؟
راستش را بخواهید — گاهی نه، و ارزش گفتن دارد. اگر تکتک افرادی که از اپلیکیشن شما استفاده میکنند در یک شهر هستند — ابزار برنامهریزی شیفت کارکنانِ یک رستوران محلی، یا ثبتنام یک باشگاه محلی — میتوانید بیشتر بخشهای سخت را نادیده بگیرید. فقط ثابتقدم باشید و زمان را برچسبگذاری کنید تا هیچ ابهامی نماند.
منطقههای زمانی همان لحظهای به دغدغهای واقعی تبدیل میشوند که یکی از این دو حالت درست باشد: دو نفر در دو مکان متفاوت یک زمان مشترک را میبینند، یا اپلیکیشن شما چیزی را طبق برنامه ارسال میکند. همان لحظهای که از این خط عبور میکنید، ارزانترین بیمه هم سادهترین کار است: همیشه منطقهی زمانی را کنار زمان نشان دهید. همین یک عادت، پیش از رسیدن راهحلهای عمیقتر، ابهامی را از بین میبرد که پشت بیشتر این داستانها بوده.
پس دفعهی بعد که فیلد تاریخ یا زمانی به اپلیکیشن خود اضافه کردید، پیش از ادامه، یک سؤال از خودتان بپرسید: این، زمانِ چه کسی است؟ اگر بتوانید با صدای بلند به آن جواب دهید، از بیشتر اپلیکیشنهایی که مردم میسازند جلوتر هستید.