Vaqt mintaqalari: UTasksdagi eng murakkab muhandislik vazifasi
UTasksni yaratishdan oldin oʻzimizga katta maqsad qoʻydik: bir vaqtning oʻzida oddiy, qulay va ishonchli vosita yaratish. Lekin hal qilishimiz kerak boʻlgan barcha texnik muammolar ichida vaqt mintaqalari bilan ishlash eng qiyinlaridan biri boʻlib chiqdi.
Vaqt mintaqalari haqiqatan murakkab ekanini qanday bildik
«Vaqt mintaqalari haqiqatan murakkab ekanini qanday bildik» boʻlimiDeyarli boshidanoq vazifalar menejerimizdan turli mamlakatlardagi odamlar foydalana boshladi va biz darhol bir nechta vaqt mintaqasini qoʻllab-quvvatlash vazifasiga duch keldik.
Vaqt mintaqalari – shunchaki hududlar orasidagi vaqt farqi emas. Ularning ortida hayratlanarli darajada koʻp murakkablik yashiringan: mavsumiy vaqt oʻzgarishlari (yozgi va qishki vaqt), qoidalarning tarixiy oʻzgarishlari, turli mamlakatlarda va hatto bir mamlakatning turli hududlarida oʻtish sanalarining har xilligi. Bunga foydalanuvchi sozlamalari, vazifalarni aniq sanalarga rejalashtirish va qurilmalar oʻrtasidagi avtomatik sinxronlashni qoʻshing – muammoning koʻlami ayon boʻladi.
Atamalar. Ularsiz iloji yoʻq.
«Atamalar. Ularsiz iloji yoʻq.» boʻlimiVaqt mintaqasining ikkita asosiy xususiyati bor: nomi (masalan, Moskva) va siljish – nol vaqt mintaqasiga nisbatan daqiqalarda oʻlchanadigan vaqt farqi.
Misol: Moskva vaqt mintaqasi – nomi: Moskva, siljishi: UTC ga nisbatan +3 soat, bu −180 daqiqaga teng.
UTC (Coordinated Universal Time – muvofiqlashtirilgan umumjahon vaqti) – Yerdagi vaqt uchun qabul qilingan umumjahon sanoq nuqtasi.
GMT (Greenwich Mean Time – Grinvich vaqti) – siljishi 0 boʻlgan nol vaqt mintaqasi. GMT va UTC bir xil siljishni bildirsa-da, interfeyslarda GMT koʻproq uchraydi, chunki bu atama tanishroq. Masalan, UTasksda Moskva vaqti GMT+3 sifatida koʻrsatiladi.
UTasksdagi vaqt mintaqalari bilan bogʻliq butun mantiq UTC ga nisbatan ishlaydi, interfeys esa oʻqish qulay boʻlishi uchun siljishlarni GMT ga nisbatan koʻrsatadi.
UTasks vaqt mintaqalari bilan qanday ishlaydi
«UTasks vaqt mintaqalari bilan qanday ishlaydi» boʻlimiVaqt mintaqasini tanlash
«Vaqt mintaqasini tanlash» boʻlimiUTasks vaqtni ikki narsani hisobga olib boshqaradi:
- Foydalanuvchi qurilmasining vaqt mintaqasi
- UTasks sozlamalarida tanlangan vaqt mintaqasi
Foydalanuvchi qurilma vaqt mintaqasiga tayanganda
«Foydalanuvchi qurilma vaqt mintaqasiga tayanganda» boʻlimiAgar foydalanuvchi oʻz vaqt mintaqasini belgilamagan boʻlsa, UTasks qurilmadagi tizim vaqt mintaqasi bilan avtomatik sinxronlanadi.
Misol: Moskvadagi foydalanuvchi Moskva vaqtidan (GMT+3) foydalanadi. Agar u Novosibirskka borsa, UTasks yangi vaqt mintaqasini telefonning tizim sozlamalaridan oladi.
Foydalanuvchi vaqt mintaqasini UTasksda qoʻlda belgilaganda
«Foydalanuvchi vaqt mintaqasini UTasksda qoʻlda belgilaganda» boʻlimiFoydalanuvchi UTasks sozlamalarida muayyan vaqt mintaqasini qatʼiy belgilab qoʻyishi mumkin. Bu vaqt mintaqasi qurilma jismonan qayerda boʻlishidan qatʼi nazar oʻzgarmaydi.
Misol: foydalanuvchi Moskva vaqti boʻyicha ishlaydi, lekin Vladivostokda (GMT+10) xizmat safarida. Vazifalar oʻz uyidagi vaqt boʻyicha koʻrinishi uchun ilovada Moskvani (GMT+3) belgilaydi. Adashib ketmaslik uchun ikkala vaqt mintaqasini ham boshida ushlab turishiga toʻgʻri keladi – lekin biz unga havas qilmaymiz.
Vazifa vaqti
«Vazifa vaqti» boʻlimiTizim va ilova vaqt mintaqalari orasidagi farqdan tashqari, vazifa vaqti qanday ishlashi bilan bogʻliq yana bir murakkablik qatlami bor.
Agar vazifada aniq vaqtsiz faqat sana boʻlsa, u Moskva, Vladivostok va Lissabondagi foydalanuvchilar uchun bir xil kunda – aytaylik, 28-oktabr, dushanba kuni koʻrinadi.
Lekin vazifada aniq vaqt boʻlsa, Moskva va Vladivostokdagi foydalanuvchilar uni soatda turlicha vaqtda koʻradi, chunki shaharlar turli vaqt mintaqalarida. Lissabondagi foydalanuvchi esa bunga qoʻshimcha ravishda yozgi vaqtga oʻtish bilan ham ish koʻradi.
Eng oddiy holat
«Eng oddiy holat» boʻlimiTasavvur qilaylik (sof faraz sifatida), Denis Qozonda yashaydi – u yerda yozgi vaqtsiz, doimiy UTC+3.
Denis UTasksni ochadi va tizim:
- uning vaqt mintaqasini qurilmadan oʻqiydi
- shu vaqt mintaqasi uchun siljishni yozib qoʻyadi: −180 daqiqa (mahalliy vaqtni UTC ga aylantirish uchun 180 daqiqa ayiriladi – tanish «GMT+3» formatiga nisbatan bu gʻalati koʻrinishi mumkin, lekin dasturlashda mahalliy vaqt bilan ishlash va saqlash uchun UTC ga aylantirish odatiy holdir)
Denis mahalliy vaqt bilan 10-noyabr soat 10:00 ga vazifa yaratadi. Uni saqlash uchun UTasks saqlangan siljishni (−180 daqiqa) oʻqiydi va siljishni ayirib, mahalliy vaqtni (10:00) UTC ga aylantiradi.
Natija: vazifa 10-noyabr, 07:00 UTC sifatida saqlanadi.
Nega hammasini UTC da saqlash kerak?
«Nega hammasini UTC da saqlash kerak?» boʻlimiBarcha vaqt maʼlumotlarini UTC da saqlash foydalanuvchilar turli vaqt mintaqalaridan ishlaydigan ilovalarda qayta ishlashni soddalashtiradi:
- Bildirishnomalar barcha ishtirokchilarning vaqt mintaqalariga koʻra toʻgʻri yuboriladi
- Bir xil vaqt oraligʻi turli hududlardagi foydalanuvchilarga toʻgʻri koʻrsatiladi
- Serverda takroriy aylantirishlar yoʻq – barcha oʻzgartirishlar mijoz tomonida bajariladi
Denis vazifasini tekshirish uchun qaytganda server vaqtni UTC da qaytaradi (10-noyabr, 07:00). UTasks siljishni (−180 daqiqa) teskari qoʻllaydi va Denis vazifani 10-noyabr, 10:00 da – oʻz mahalliy vaqtida koʻradi.
Denisning jamoadoshlari xuddi shu vazifani qanday koʻradi:
«Denisning jamoadoshlari xuddi shu vazifani qanday koʻradi:» boʻlimiDenis butun jamoa uchun vazifa yaratadi: Moskva vaqti bilan 10-noyabr, soat 10:00.
Vazifa 07:00 UTC sifatida saqlanadi.
- Lyosha (Kaliningrad, GMT+2): 07:00 UTC + 2 soat = Kaliningrad vaqti bilan 09:00
- Kamil (Ostona, GMT+6): 07:00 UTC + 6 soat = Ostona vaqti bilan 13:00
- Leysan (Maldiv orollari, GMT+5): 07:00 UTC + 5 soat = Maldiv vaqti bilan 12:00 (jaziramaning eng avji)
Bu oddiy algoritm foydalanuvchining tizim vaqt mintaqasi uning haqiqiy joylashuviga mos kelsa va oʻzgarmasa, toʻgʻri ishlaydi.
Murakkabroq holat
«Murakkabroq holat» boʻlimiFoydalanuvchi ilovada qurilmaning tizim vaqt mintaqasidan farq qiladigan vaqt mintaqasini tanlaganda ishlar murakkablashadi.
Aytaylik, Denis Lissabonga koʻchib oʻtdi – nonushtaga pastel de nata yeydi, kechqurun portvein ichadi, oʻzini himoya qilish mashgʻulotlariga qatnaydi – lekin xayolan hamon Qozonda: garajini va ellikta boʻsh shisha bankani sotyapti. UTasks sozlamalarida barcha vazifalari odatiy jadval boʻyicha qolishi uchun Moskva vaqtini (UTC+3) qoʻlda tanlaydi.
Denis jismonan Lissabonda, lekin «keyingi hafta soat 10:00 ga» vazifa yaratadi va bu vaqtni Moskva vaqti deb kutadi.
Muammo shundaki: koddagi sanalar bilan bogʻliq barcha amallar qurilmaning tizim vaqt mintaqasi kontekstida – bu holda Lissabon (UTC+1) vaqtida bajariladi. Agar UTasks sodda algoritmdan foydalansa, sanani Moskva emas, tizim vaqt mintaqasi (Lissabon) boʻyicha qayta ishlardi.
Sodda yondashuvda nima notoʻgʻri ketadi:
«Sodda yondashuvda nima notoʻgʻri ketadi:» boʻlimiDenis vazifani Moskva vaqti bilan 10:00 ga qoʻyadi → Lissabon siljishi qoʻllanadi (yozda +1) → vazifa serverga moʻljallangan 07:00 UTC (Moskva vaqti bilan 10:00) oʻrniga 09:00 UTC (Moskva vaqti bilan 12:00) sifatida yuboriladi → ilova goʻyo toʻgʻri 10:00 ni koʻrsatsa ham, vazifa notoʻgʻri vaqt bilan saqlanadi → bildirishnomalar ikki soat kechikib keladi.
Bizning yechimimiz:
«Bizning yechimimiz:» boʻlimi- UTasks qurilmaning tizim vaqt mintaqasi (Lissabon) va foydalanuvchi sozlamalarda tanlagan vaqt mintaqasi (Moskva) orasidagi farqni hisoblaydi. Bu misolda: 2 soat (UTC+3 − UTC+1).
- Saqlashdan oldin UTasks mahalliy vaqtni shu farqqa toʻgʻrilaydi: Denis Moskva vaqti bilan 10:00 ni kiritdi → qurilmaning mahalliy vaqti (Lissabon) toʻgʻrilanadi: 10:00 − 2 soat = Lissabon vaqti bilan 08:00.
- UTasks toʻgʻrilangan vaqtni UTC ga aylantiradi: 07:00 UTC – bu aynan Moskva vaqti bilan 10:00, Denis kutganidek.
Eng murakkab holat: vaqt mintaqasi ichida siljishning oʻzgarishi
«Eng murakkab holat: vaqt mintaqasi ichida siljishning oʻzgarishi» boʻlimiYozgi vaqtga oʻtish va undan qaytish tufayli vaqt mintaqasi ichidagi siljish oʻzgarganda mantiq yanada chalkashadi.
Lissabonni olaylik: u yerda soatlar 27-oktabr kuni mahalliy yozgi vaqt bilan soat 02:00 da orqaga suriladi.
10-oktabrda (Lissabon hali yozgi vaqtda) Denis 10-noyabrdagi (Lissabon allaqachon qishki vaqtda boʻladi) Beyonse konsertiga chipta oladi va UTasksda eslatma yaratadi: 10-noyabr, 10:00 – «Beyonsega gul sotib olish».
Bu bir nechta savol tugʻdiradi:
- Denis qishki vaqt bilan 10:00 ni (UTC+0) nazarda tutyaptimi yoki yozgi vaqt bilan 10:00 ni (UTC+1)?
- Toʻgʻri vaqtni saqlash uchun UTasks siljish oʻzgarishini qanday hisobga olishi kerak?
- Beyonse uchun 20 yevrolik guldasta munosibmi yoki bir kun oldin portveindan voz kechib, 25 yevroga sarflagani maʼqulmi?
Siljish oʻzgarishlari vaqt mintaqalarining amaldagi qoidalariga bogʻliq – hukumatlar esa ularni oʻzgartirishi mumkin va oʻzgartiradi ham (yozgi vaqtni bekor qilish, oʻtish sanasini oʻzgartirish va hokazo). Shu sababli dolzarb maʼlumotsiz aniq xatti-harakatni oldindan aytib boʻlmaydi.
Yechim: qurilmaning tizim vaqtidan foydalanish
«Yechim: qurilmaning tizim vaqtidan foydalanish» boʻlimiOperatsion tizim yozgi vaqtning amaldagi qoidalarini biladi. Oʻz vaqt mintaqalari bazasini yuritish oʻrniga UTasks bu ishni OT ga topshiradi:
- Kerakli vaqt mintaqasi uchun formatlangan vaqtni soʻrash. Denis kalendarda sanani tanlaganda (aytaylik, 10-noyabr, 10:00), UTasks tizimdan soʻraydi: «Bu sanani Lissabon vaqt mintaqasi uchun formatla».
- 10-oktabr uchun (yozgi vaqt) tizim 10-oktabr, 10:00, UTC+1 ni qaytaradi
- 10-noyabr uchun (qishki vaqt) tizim 10-noyabr, 10:00, UTC+0 ni qaytaradi. OT soʻralgan sana uchun toʻgʻri siljishni avtomatik qoʻllaydi.
- Tizim javobidan siljishni ajratib olish. Formatlangan natijada siljish bor (yozda +1, qishda 0). UTasks uni oʻqiydi va ishlatadi.
- Serverga yuborishdan oldin vaqtni toʻgʻrilash. UTasks qurilmaning tizim vaqt mintaqasi (Moskva, UTC+3) va foydalanuvchi tanlagan vaqt mintaqasi (Lissabon) orasidagi farqni hisoblaydi va shunga koʻra toʻgʻrilaydi: Denis 10-noyabr, 10:00 ni tanlaydi. Qurilma vaqt mintaqasi: Moskva (UTC+3). Hisob: 10:00 − 3 + 0 = 07:00 UTC. Server foydalanuvchi vaqt mintaqasi va uning joriy siljishiga allaqachon toʻgʻrilangan vaqtni oladi.
Siljishlar dolzarb boʻlishi uchun UTasks tizim vaqt mintaqasining siljishi oʻzgarganini muntazam tekshiradi (masalan, 28-oktabrdagi oʻtishdan keyin). Agar oʻzgargan boʻlsa, ilova yangilanadi va keyinchalik yangi qiymatlardan foydalanadi.
Shunday qilib, Denis 10-oktabrda 10-noyabr soat 10:00 ga vazifa yaratganda UTasks u yaqinlashayotgan vaqt oʻzgarishidan xabardor va qishki siljishni (UTC+0) nazarda tutyapti deb hisoblaydi. 10-noyabr uchun toʻgʻri siljish saqlash paytida qoʻllanadi va vaqt aniq qoladi.
Xulosalar
«Xulosalar» boʻlimiVaqt mintaqalari bilan ishlash UTasksni yaratishdagi eng mashaqqatli muhandislik vazifalaridan biri – va eng ibratlilaridan biri boʻlib chiqdi.
Asosiy tamoyil: hammasini UTC da saqlash turli hududlardagi foydalanuvchilarni sinxron saqlaydigan ishonchli poydevor.
Lekin haqiqatan qulay interfeys yaratish uchun koʻplab nozik jihatlarni hisobga olish kerak: vaqtni ham mahalliy, ham foydalanuvchi tanlagan vaqt mintaqasiga koʻra toʻgʻri koʻrsatish, bildirishnomalarni oʻz vaqtida yuborish va mavsumiy siljish qoidalariga rioya qilish.
Bizning yechimimiz avtomatlashtirish (qurilmaning tizim vaqti bilan sinxronlash) va moslashuvchanlik (vaqt mintaqasini qoʻlda tanlash) oʻrtasidagi muvozanatni saqlaydi.
Yana bir narsa: dasturchimiz Lyosha bu mahoratini muntazam charxlab turadi – ilovada vaqt mintaqalarini qoʻlda almashtiradi va natijalarni qoʻlda tekshiradi. Hech qanday mavhum mulohaza toʻliq oldindan koʻra olmaydigan nozik chekka holatlarni shu tarzda topamiz.