datetime — date, time, datetime, timedelta, strftime
Muammodan boshlaylik
Kutubxona dasturi: kitob 14 kunga beriladi. Qaytarish sanasini hisoblash, kechikkan kunlar uchun jarima, "15.11.2026" ko'rinishida chiqarish, foydalanuvchi kiritgan "20.11.2026" ni tushunish...
String lar bilan:
olingan = "28.10.2026"
kun = int(olingan[:2]) + 14 # 42 — oktabrda 42-kun yo'q!
Oylardagi kunlar soni, kabisa yillar, yil almashishi — qo'lda hisoblab bo'lmaydi.
Asosiy turlar
from datetime import date, time, datetime, timedelta
| Tur | Nima | Misol |
|---|---|---|
date |
Sana | 2026-11-08 |
time |
Vaqt | 14:30:00 |
datetime |
Sana + vaqt | 2026-11-08 14:30:00 |
timedelta |
Davomiylik, farq | 14 kun, 3 soat |
Hayotiy o'xshatma
Taqvim va soat. date — devordagi taqvim varaqi, time — soat ko'rsatkichi, datetime — ikkalasi birga (telefoningiz ekranidagi kabi). timedelta — "ikki hafta keyin" yoki "uch soat oldin" degan ibora: u aniq sana emas, oraliq.
Yaratish
from datetime import date, datetime
bugun = date.today() # 2026-11-08
hozir = datetime.now() # 2026-11-08 14:30:15.123456
tugilgan = date(2002, 3, 15)
uchrashuv = datetime(2026, 11, 20, 15, 30)
print(bugun.year, bugun.month, bugun.day) # 2026 11 8
print(hozir.hour, hozir.minute)
print(bugun.weekday()) # 0 — dushanba ... 6 — yakshanba
timedelta — hisob-kitob
from datetime import date, timedelta
olingan = date(2026, 10, 28)
qaytarish = olingan + timedelta(days=14)
print(qaytarish) # 2026-11-11 — oy almashishi avtomatik
kecha = date.today() - timedelta(days=1)
keyingi_hafta = date.today() + timedelta(weeks=1)
Ikki sana farqi
bugun = date(2026, 11, 20)
kechikish = bugun - qaytarish # timedelta
print(kechikish.days) # 9
jarima = max(0, kechikish.days) * 2000
print(f"Jarima: {jarima:,} so'm") # Jarima: 18,000 so'm
boshlash = datetime(2026, 11, 8, 9, 0)
tugash = datetime(2026, 11, 8, 17, 45)
ish = tugash - boshlash
print(ish) # 8:45:00
print(ish.total_seconds() / 3600) # 8.75 soat
timedelta(days=, hours=, minutes=, seconds=, weeks=) — oy va yil yo'q (ularning uzunligi har xil).
Yosh hisoblash
def yosh(tugilgan: date, bugun: date | None = None) -> int:
bugun = bugun or date.today()
tugilgan_kun_otdimi = (bugun.month, bugun.day) >= (tugilgan.month, tugilgan.day)
return bugun.year - tugilgan.year - (0 if tugilgan_kun_otdimi else 1)
print(yosh(date(2002, 3, 15))) # 24
(bugun - tugilgan).days // 365 — kabisa yillar tufayli noaniq.
Formatlash — strftime
hozir = datetime(2026, 11, 8, 14, 5)
print(hozir.strftime("%d.%m.%Y")) # 08.11.2026
print(hozir.strftime("%d.%m.%Y %H:%M")) # 08.11.2026 14:05
print(hozir.strftime("%Y-%m-%d")) # 2026-11-08
print(f"{hozir:%d.%m.%Y}") # f-string ichida ham
| Kod | Ma'nosi | Misol |
|---|---|---|
%d |
Kun (2 xonali) | 08 |
%m |
Oy (2 xonali) | 11 |
%Y |
Yil (4 xonali) | 2026 |
%H |
Soat (24) | 14 |
%I |
Soat (12) | 02 |
%M |
Daqiqa | 05 |
%S |
Soniya | 00 |
%A / %B |
Hafta kuni / oy nomi (inglizcha) | Sunday / November |
%j |
Yilning nechanchi kuni | 312 |
O'zbekcha nomlar
%B, %A — tizim tiliga bog'liq va ko'pincha inglizcha. Ishonchli yo'l — o'z ro'yxatingiz:
OYLAR = ["yanvar", "fevral", "mart", "aprel", "may", "iyun",
"iyul", "avgust", "sentabr", "oktabr", "noyabr", "dekabr"]
KUNLAR = ["dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba", "yakshanba"]
d = date(2026, 11, 8)
print(f"{d.day}-{OYLAR[d.month - 1]}, {KUNLAR[d.weekday()]}") # 8-noyabr, yakshanba
String dan — strptime
from datetime import datetime
matn = "20.11.2026 15:30"
vaqt = datetime.strptime(matn, "%d.%m.%Y %H:%M")
print(vaqt) # 2026-11-20 15:30:00
sana = datetime.strptime("20.11.2026", "%d.%m.%Y").date()
Format mos kelmasa — ValueError:
try:
sana = datetime.strptime(input("Sana (KK.OO.YYYY): "), "%d.%m.%Y").date()
except ValueError:
print("Noto'g'ri format yoki bunday sana yo'q")
"31.02.2026" — ham ValueError (fevralda 31 kun yo'q).
ISO format — API va JSON uchun
hozir.isoformat() # '2026-11-08T14:05:00'
datetime.fromisoformat("2026-11-08T14:05:00")
date.fromisoformat("2026-11-08")
JSON va API larda sanalar uchun ISO format — standart (34-dars).
Vaqt mintaqalari
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
toshkent = datetime.now(ZoneInfo("Asia/Tashkent"))
print(toshkent) # 2026-11-08 14:05:00+05:00
utc = datetime.now(timezone.utc)
print(utc.astimezone(ZoneInfo("Asia/Tashkent")))
nyu_york = toshkent.astimezone(ZoneInfo("America/New_York"))
| Naive | Aware | |
|---|---|---|
| Mintaqa ma'lumoti | Yo'q | Bor (+05:00) |
| Misol | datetime.now() |
datetime.now(ZoneInfo("Asia/Tashkent")) |
| Qachon | Lokal, oddiy skriptlar | Server, ma'lumotlar bazasi, turli mamlakatlar |
[!WARNING] Naive va aware datetime larni solishtirish yoki ayirish —
TypeError: can't compare offset-naive and offset-aware datetimes. Serverlar va bazalarda vaqtni UTC da saqlang va faqat foydalanuvchiga ko'rsatishda uning mintaqasiga o'giring.
[!INFO] Windows da
zoneinfouchun mintaqalar bazasi bo'lmasligi mumkin —pip install tzdata(ZoneInfoNotFoundErrorchiqsa).
time moduli — o'lchash va kutish
import time
time.sleep(2) # 2 soniya kutish
boshlash = time.perf_counter()
ogir_ish()
print(f"{time.perf_counter() - boshlash:.3f} s") # bajarilish vaqti
time.time() # Unix timestamp: 1762590300.12
datetime.fromtimestamp(1762590300)
Tez-tez uchraydigan xatolar
strftime va strptime ni aralashtirish:
strftime— datetime → string (format)strptime— string → datetime (parse)
%m va %M: %m — oy, %M — daqiqa.
Oy qo'shish uchun timedelta:
date(2026, 1, 31) + timedelta(days=30) # 2026-03-02 — "bir oy keyin" emas
Oylar bilan aniq ishlash uchun — dateutil.relativedelta (tashqi kutubxona).
Xulosa
datetime — sanalar bilan to'g'ri hisob-kitob: oylar, kabisa yillar, mintaqalar.
Eslab qoling:
date.today(),datetime.now(),date(Y, M, D)timedelta(days=14)— qo'shish/ayirish; ikki sana farqi —timedelta,.daysstrftime("%d.%m.%Y")— string ga;strptime(s, format)— string dan- O'zbekcha oy va kun nomlari — o'z ro'yxatingiz
- ISO —
isoformat()/fromisoformat()— API va JSON uchun - Server da — UTC va aware datetime (
ZoneInfo) time.perf_counter()— o'lchash,time.sleep()— kutish
Keyingi dars
42-dars: math, random, statistics — asosiy funksiyalar