Koddagi sanalar va vaqt zonalari: UTC, ISO 8601 va tipik xatolar
Amaliyot3 daqInnovialabs tahririyati
Qisqacha
Vaqt momentini UTC’da saqlang, uni ofsetli ISO 8601 satri sifatida uzating va mahalliy vaqtga faqat foydalanuvchiga ko‘rsatishda Asia/Tashkent kabi IANA zona orqali o‘giring.
Qisqa javob
Sanalar bilan bog‘liq xatolarning aksariyati kod ikki xil tushunchani chalkashtirib yuborganidan kelib chiqadi:
- vaqt momenti (instant) — butun dunyo uchun bir xil bo‘lgan vaqt shkalasidagi nuqta: «buyurtma yaratildi»;
- kalendar sanasi yoki mahalliy vaqt — inson o‘z shahridagi soatda ko‘radigan narsa: «tug‘ilgan kun 5-mart», «uchrashuv Toshkent vaqti bilan 10:00 da».
Qoida oddiy: momentlarni UTC’da saqlang, ularni aniq ofsetli ISO 8601 formatida uzating va mahalliy vaqtga faqat oxirgi qadamda — foydalanuvchiga ko‘rsatishda o‘giring. Vaqtsiz kalendar sanalarini UTC yarim tun sifatida emas, sana sifatida saqlang.
ISO 8601: almashish uchun yagona format
ISO 8601 — barcha tillar va ma’lumotlar bazalari tushunadigan sana yozish standarti:
| Qiymat | Misol |
|---|---|
| Sana | 2026-03-05 |
| UTC’dagi moment | 2026-03-05T07:30:00Z |
| Ofsetli moment | 2026-03-05T12:30:00+05:00 |
Z harfi UTC’ni bildiradi. Z ham, ofset ham bo‘lmagan satr (2026-03-05T12:30:00) — noma’lum zonadagi mahalliy vaqt. API’da bunday satrlarni umuman qabul qilmagan ma’qul.
Ofset — bu vaqt zonasi emas
+05:00 — ofset, Asia/Tashkent esa IANA zona: u qoidalar tarixini, jumladan yozgi vaqtga o‘tish (DST) va qonundagi o‘zgarishlarni saqlaydi. Toshkentda hozir yozgi vaqtga o‘tish yo‘q, ammo Yevropa yoki AQShdagi foydalanuvchilaringizda bor. Agar faqat ofsetni saqlasangiz, soatlar o‘zgargandan keyin «bir haftadan so‘ng xuddi shu soat»ni to‘g‘ri hisoblay olmaysiz.
Shuning uchun takrorlanuvchi tadbirlar va jadvallar uchun mahalliy vaqt va zona nomini saqlang, allaqachon sodir bo‘lgan faktlar uchun esa UTC’dagi momentni.
Keng tarqalgan xatolar
- Bir kunlik siljish. Tug‘ilgan kun
2026-03-05T00:00:00Zsifatida saqlangan, manfiy ofsetli zonadagi foydalanuvchi esa 4-martni ko‘radi. Yechim: vaqtsiz «sana» turi. - JavaScript’da satrni parse qilish.
new Date("2026-03-05")UTC yarim tuni sifatida o‘qiladi,new Date("2026-03-05T00:00")esa brauzer zonasidagi yarim tun sifatida. Bitta belgi natijani o‘zgartiradi. - Noldan boshlanadigan oylar. JS’dagi
Dateda yanvar —0. - «Plyus 1 kun» o‘rniga «plyus 24 soat». Soat o‘zgaradigan kuni sutka 23 yoki 25 soat davom etadi.
- Server vaqti. Server dasturchidan boshqa zonada ishlaydi va «bugungi» hisobot yarim tunda boshlanmaydi. Server va bazani UTC’da saqlang.
- Turli ofsetli satrlarni solishtirish.
12:30+05:00va07:30Z— bir xil moment, lekin satr sifatida teng emas.
Kodda qanday qilish kerak
JavaScript’da kerakli zonada ko‘rsatish uchun o‘rnatilgan Intl bor:
const d = new Date("2026-03-05T07:30:00Z");
new Intl.DateTimeFormat("uz-UZ", {
timeZone: "Asia/Tashkent",
dateStyle: "medium",
timeStyle: "short",
}).format(d);
Arifmetika va formatlash uchun date-fns va date-fns-tz paketi (formatInTimeZone, fromZonedTime) qulay. Python’da standart zoneinfo moduli mavjud:
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
now = datetime.now(timezone.utc) # UTC'dagi moment
local = now.astimezone(ZoneInfo("Asia/Tashkent"))
print(local.isoformat())
tzinfo siz «sodda» (naive) datetime lardan qoching: ularni zonali (aware) qiymatlar bilan to‘g‘ri solishtirib bo‘lmaydi.
API va ma’lumotlar bazalari uchun cheklist
- Momentlarni zonali turda saqlang (PostgreSQL’da —
timestamptz), ulanish sessiyasini esa UTC’da ushlab turing. - Kalendar sanalarini
timestampemas,dateturida saqlang. - API ISO 8601 ni
Zyoki ofset bilan qabul qiladi va qaytaradi; ofsetsiz satrlarni rad eting. - Jadvallar uchun mahalliy vaqt va IANA zona nomini alohida maydonlarda saqlang.
- Foydalanuvchi zonasini IP bo‘yicha taxmin qilmang, profil yoki brauzerdan oling (
Intl.DateTimeFormat().resolvedOptions().timeZone). - Davr chegaralarini («kun uchun», «oy uchun») foydalanuvchi zonasida hisoblang, so‘ng so‘rov uchun UTC’ga o‘giring.
- Yozgi vaqtga o‘tish va oy oxiri atrofidagi sanalar uchun testlar yozing.
- Unix vaqtini bir joyda soniyalarda, boshqasida millisoniyalarda saqlamang — bittasini kelishib oling.