datetime — date, time, datetime, timedelta, strftime

~15 daq · Python · Modullar va Standart kutubxona

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 zoneinfo uchun mintaqalar bazasi bo'lmasligi mumkin — pip install tzdata (ZoneInfoNotFoundError chiqsa).


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, .days
  • strftime("%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