# JavaScript sana va vaqt (Date)

> JavaScript'da sana bilan ishlash: Date obyekti, hozirgi vaqtni olish, formatlash, sanalar farqini hisoblash va vaqt zonasi. Amaliy misollar bilan.

Manba: https://learncode.uz/javascript/sana-vaqt/
Sana: 2026-05-30

Buyurtma sanasi, foydalanuvchi yoshi, "3 daqiqa oldin" yozuvi — bular **Date**
obyekti orqali hisoblanadi.

## Hozirgi sana

```js
const now = new Date();

console.log(now);
console.log(now.getFullYear());
console.log(now.getMonth());
console.log(now.getDate());
```

> **Oy noldan boshlanadi**
>
> `getMonth()` yanvar uchun **0**, dekabr uchun **11** qaytaradi. Bu tilning
> eng ko'p chalkashtiradigan joyi. Odam o'qiydigan raqam uchun `getMonth() + 1`
> yozish kerak. Kun (`getDate()`) esa odatdagidek 1 dan boshlanadi.

## Sana qismlari

```js
const d = new Date();

console.log("Yil:", d.getFullYear());
console.log("Oy:", d.getMonth() + 1);
console.log("Kun:", d.getDate());
console.log("Soat:", d.getHours());
console.log("Daqiqa:", d.getMinutes());
console.log("Hafta kuni:", d.getDay());
```

`getDay()` hafta kunini beradi: **0 — yakshanba**, 1 — dushanba, ... 6 — shanba.

## Aniq sana yaratish

```js
const birthDate = new Date(2000, 4, 15);
console.log(birthDate);

const fromText = new Date("2026-09-08");
console.log(fromText);
```

Birinchi usulda oy **noldan** sanaladi: `4` — may. Ikkinchi usul
(`YYYY-MM-DD`) odam o'qiydigan tartibda va xatosi kam — shuni afzal ko'ring.

## Formatlash

Sana qismlarini [matn metodlari](https://learncode.uz/javascript/matn-metodlari) bilan birlashtirib,
kerakli ko'rinishga keltiriladi:

```js
const d = new Date(2026, 8, 8);

const day = String(d.getDate()).padStart(2, "0");
const month = String(d.getMonth() + 1).padStart(2, "0");
const year = d.getFullYear();

console.log(`${day}.${month}.${year}`);
console.log(d.toISOString().slice(0, 10));
```

`padStart(2, "0")` bir xonali kunni `08` ko'rinishiga keltiradi.

Tayyor formatlash ham bor:

```js
const d = new Date(2026, 8, 8);

console.log(d.toLocaleDateString("uz-UZ"));
console.log(d.toLocaleDateString("en-US"));
console.log(d.toLocaleDateString("uz-UZ", {
  year: "numeric", month: "long", day: "numeric"
}));
```

## Sanalar farqi

```js
const start = new Date("2026-01-01");
const endTime = new Date("2026-09-08");

const diffMs = endTime - start;
const days = diffMs / (1000 * 60 * 60 * 24);

console.log("Millisoniya:", diffMs);
console.log("Kunlar:", Math.round(days));
```

Sanalarni ayirsangiz **millisoniya** chiqadi. Kunga o'tkazish uchun
`1000 × 60 × 60 × 24` ga bo'linadi.

## Yosh hisoblash

```js
function calcAge(birthDate) {
  const today = new Date();
  const t = new Date(birthDate);
  let age = today.getFullYear() - t.getFullYear();

  const monthDiff = today.getMonth() - t.getMonth();
  if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < t.getDate())) {
    age--;
  }
  return age;
}

console.log(calcAge("2000-05-15"));
```

Oddiy ayirish yetarli emas: tug'ilgan kun bu yil hali kelmagan bo'lsa,
bittaga kam bo'lishi kerak.

## Vaqt qo'shish

```js
const today = new Date("2026-09-08");

const after = new Date(today);
after.setDate(after.getDate() + 30);

console.log(today.toISOString().slice(0, 10));
console.log(after.toISOString().slice(0, 10));
```

`setDate` oy chegarasidan o'tsa, oyni o'zi to'g'irlaydi.

> **Nusxa oling**
>
> `setDate` sanani **o'zgartiradi**. Asl sanani saqlash uchun avval
> `new Date(asl)` bilan nusxa oling — yuqoridagi misolda shunday qilingan.

## Vaqt belgisi

```js
console.log(Date.now());

const d = new Date("2026-09-08");
console.log(d.getTime());
```

Bu — 1970-yil 1-yanvardan beri o'tgan millisoniyalar. Sanalarni taqqoslash
va vaqt o'lchashda qulay.

## Amaliy mashq

Sana bilan ishlang:

1. Hozirgi sanani `DD.MM.YYYY` ko'rinishida chiqaring;
2. `getMonth()` natijasini `getMonth() + 1` bilan solishtiring;
3. o'z tug'ilgan sanangizdan yoshni hisoblang;
4. bugundan 100 kun keyingi sanani toping;
5. `toLocaleDateString("uz-UZ")` natijasini ko'ring;
6. `Date.now()` bilan kod bajarilish vaqtini o'lchang.

## Qisqacha xulosa

- `new Date()` — hozirgi vaqt; `new Date("YYYY-MM-DD")` — aniq sana.
- **`getMonth()` noldan boshlanadi** — odam uchun `+1` qo'shiladi.
- `getDay()` hafta kuni: 0 — yakshanba.
- Sanalar ayirmasi **millisoniya** beradi.
- `setDate` sanani o'zgartiradi — avval nusxa oling.
- `toLocaleDateString` tilga mos formatlaydi.

Keyingi darsda [xatolarni ushlash](https://learncode.uz/javascript/xatolar) — `try/catch` bilan
dasturni buzilishdan saqlashni ko'ramiz.
