Asosiy kontentga o‘tish
Innovialabs

Koddagi sanalar va vaqt zonalari: UTC, ISO 8601 va tipik xatolar

Amaliyot3 daq

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:

QiymatMisol
Sana2026-03-05
UTC’dagi moment2026-03-05T07:30:00Z
Ofsetli moment2026-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:00Z sifatida 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 Date da 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:00 va 07: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

  1. Momentlarni zonali turda saqlang (PostgreSQL’da — timestamptz), ulanish sessiyasini esa UTC’da ushlab turing.
  2. Kalendar sanalarini timestamp emas, date turida saqlang.
  3. API ISO 8601 ni Z yoki ofset bilan qabul qiladi va qaytaradi; ofsetsiz satrlarni rad eting.
  4. Jadvallar uchun mahalliy vaqt va IANA zona nomini alohida maydonlarda saqlang.
  5. Foydalanuvchi zonasini IP bo‘yicha taxmin qilmang, profil yoki brauzerdan oling (Intl.DateTimeFormat().resolvedOptions().timeZone).
  6. Davr chegaralarini («kun uchun», «oy uchun») foydalanuvchi zonasida hisoblang, so‘ng so‘rov uchun UTC’ga o‘giring.
  7. Yozgi vaqtga o‘tish va oy oxiri atrofidagi sanalar uchun testlar yozing.
  8. Unix vaqtini bir joyda soniyalarda, boshqasida millisoniyalarda saqlamang — bittasini kelishib oling.

Ko‘p beriladigan savollar

Vaqt o‘tib foydalanuvchilar, serverlar va tashqi servislar boshqa zonalarda paydo bo‘ladi. Saqlashda UTC hozir hech narsaga tushmaydi, keyinroq ma’lumotlarni ko‘chirish esa qimmatga tushadi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.