IlmHamroh
JavaScript Full-stack/12-qism. JavaScript: ilg'or mavzular va kod sifati11/44-dars23 daqiqa
Mundarija (41)

JavaScript Date asoslari: sana yaratish, timestamp va getter/setterlar

Qisqacha: Date — ichida bitta son saqlaydigan obyekt: 1970-yil 1-yanvar, 00:00 UTC dan beri o'tgan millisekundlar. Bu son timestamp deyiladi, Date.now() hozirgisini beradi. Sana new Date(2026, 9, 5) yoki new Date("2026-10-05T12:00:00Z") bilan yaratiladi, qismlari getFullYear(), getMonth(), getDate(), getHours() bilan olinadi. Ikki tuzoq: oy 0 dan boshlanadi (9 — oktabr), setterlar esa sanani joyida o'zgartiradi.

Bu darsda

  • Date ichida nima saqlanishini — timestamp va epoch'ni tushuntira olasiz.
  • Sanani to'rt usulda yaratasiz va qaysi biri qachon kerakligini bilasiz.
  • Getterlar bilan sananing qismlarini olasiz, getMonth() va getDay() tuzoqlariga tushmaysiz.
  • Setterlar bilan sanani surasiz va "31-yanvar + 1 oy = 3-mart" holatini tushuntira olasiz.
  • Invalid Date ni taniysiz va noto'g'ri sanani kod ichida ushlaysiz.

Oldin bilishingiz kerak: Matn ↔ son va sonni tekshirish, Pure funksiya va side effect, Sayoz va chuqur nusxalash, Konstruktor funksiya va new.

1. Nega bu kerak?

RegExp darslarida «Bahor» bron formasidagi vaqtni matn sifatida tekshirdik: 19:00 shaklga mosmi, yo'qmi. Lekin shakl to'g'ri bo'lishi hali hammasi emas. Choyxona egasi Jasur aka stajyor dasturchi Sardordan yana uchta narsa so'radi:

  • saytda "Hozir ochiq" yoki "Hozir yopiq" yozuvi chiqsin (ish vaqti 07:00–23:00);
  • har buyurtmaga qachon berilgani yozib qo'yilsin;
  • obunachi mehmonlarga "keyingi to'lov kuni" ko'rsatilsin — bir oydan keyin.

Uchalasi ham matn bilan ishlamaydi. "Hozir soat nechchi?", "bu vaqtga bir oy qo'shsa qaysi kun bo'ladi?" — bular hisob-kitob. Hisob uchun JavaScript'da tayyor obyekt bor — Date.

Siz uni bir necha marta ko'rgansiz. 09-qismda sahifa pastiga joriy yilni new Date().getFullYear() bilan yozgandik. 11-qismda Date.now() bilan o'tgan vaqtni o'lchadik. Har safar "sanalarni keyin o'rganamiz" degandik. Bu dars — o'sha "keyin".

Oldindan ogohlantiramiz: Date 1995-yilda, JavaScript bilan birga, shoshilib yozilgan. Uning ko'p qoidasi o'sha davrdagi Java tilidan ko'chirilgan va bugun g'alati tuyuladi. Shuning uchun bu darsda qanday ishlashi bilan birga qayerda qoqilishini ham ko'p ko'ramiz. Keyingi ikki darsda vaqt zonalari va yangi standart — Temporal keladi.

2. Date ichida nima bor

2.1 Bitta son: timestamp

Sana bizga murakkab ko'rinadi: yil, oy, kun, soat, daqiqa. Date esa ichida bularning hech birini saqlamaydi. U faqat bitta son saqlaydi.

Bu son — ma'lum bir boshlang'ich nuqtadan beri o'tgan millisekundlar (1 soniya = 1000 millisekund). Xuddi sekundomer kabi: u yil-oyni bilmaydi, faqat "boshlanganidan beri qancha o'tdi" deb sanaydi. Boshlang'ich nuqta — 1970-yil 1-yanvar, 00:00:00, UTC. U epoch (o'qilishi: "ipok", ma'nosi — "davr boshi") deb ataladi. Undan beri o'tgan millisekundlar soni esa timestamp ("vaqt belgisi").

UTC — butun dunyo uchun yagona "asosiy soat". Toshkent soati undan 5 soat oldinda yuradi: UTC bo'yicha 12:00 bo'lsa, Toshkentda 17:00. Bu haqda Date va vaqt zonalari darsida to'liq gaplashamiz. Hozircha bitta narsani biling: timestamp zonaga bog'liq emas. Bir lahzada dunyoning hamma joyida u bir xil.

Uni chiziq deb tasavvur qiling. Chiziqning 0-nuqtasi — epoch. Har lahza — shu chiziqdagi bitta nuqta, uning epoch'dan uzoqligi esa millisekundlarda o'lchanadi.

flowchart LR
  E["Epoch<br/>1970-01-01 00:00 UTC<br/>timestamp = 0"] --> T["Timestamp<br/>1791201600000"]
  T --> L["Toshkentda ko'rinishi<br/>5-oktabr 2026, 17:00"]
  T --> U["UTC ko'rinishi<br/>5-oktabr 2026, 12:00"]

Diagrammaga qarang: o'rtada bitta son turibdi. Undan ikki xil "ko'rinish" chiqadi — Toshkent soati va UTC soati. Son esa o'zgarmaydi. Date aynan shunday ishlaydi.

2.2 Epoch'ning o'zi va hozirgi lahza

Timestamp 0 bo'lgan sana — epoch'ning o'zi:

js
console.log(new Date(0)); // 1970-01-01T00:00:00.000Z

Oxiridagi Z harfi "UTC vaqti" degani. Bu yozuv shaklini — 2026-10-05T12:00:00.000Z ni — keyingi darsda batafsil ko'ramiz. U ISO 8601 deb ataladigan xalqaro standart.

Hozirgi lahzaning timestamp'ini Date.now() beradi:

js
const hozir = Date.now();

console.log(typeof hozir); // number
console.log(hozir > 1767225600000); // true

Date.now() — oddiy son. U har millisekundda o'zgaradi, shuning uchun uning qiymatini bu yerda yozmadik — sizda boshqacha chiqadi. Faqat turini va "2026-yil 1-yanvardan keyinmi?" degan savolni tekshirdik (1767225600000 — o'sha kunning timestamp'i).

Maslahat: Bu darsdagi hamma misolda aniq sana ishlatamiz: new Date("2026-10-05T12:00:00Z") — 2026-yil 5-oktabr, UTC bo'yicha 12:00, Toshkentda 17:00. Shunda kod har kuni bir xil natija beradi va siz uni "Konsolda" yozilgani bilan solishtira olasiz.

2.3 Node va brauzer Date ni har xil ko'rsatadi

Bitta sanani ikki xil chiqaramiz:

js
const sana = new Date("2026-10-05T12:00:00Z");

console.log(sana);
console.log(String(sana));

Konsolda:

text
2026-10-05T12:00:00.000Z
Mon Oct 05 2026 17:00:00 GMT+0500 (Uzbekistan Standard Time)

Birinchi qator — Node'ning console.log ko'rinishi: ISO 8601, doim UTC'da. Ikkinchisi — sananing matnga aylangan ko'rinishi: kompyuteringiz zonasida, inglizcha. GMT+0500 — "UTC dan 5 soat oldinda".

Brauzer konsoli (DevTools) console.log(sana) ga ikkinchi ko'rinishni chiqaradi — Mon Oct 05 2026 17:00:00 GMT+0500 .... Ma'nosi bir xil: ikkalasi ham o'sha bitta lahza.

Diqqat: Bu darsdagi "Konsolda" bloklari Toshkent vaqti (UTC+5) bo'yicha yozilgan. Kompyuteringiz boshqa zonada bo'lsa — masalan, Moskva yoki Seul vaqtida — soatlar boshqacha chiqadi. Bu xato emas: Date mahalliy soatni kompyuter sozlamasidan oladi. Natijani zonadan qat'i nazar bir xil qilish yo'lini Intl.DateTimeFormat darsida o'rganamiz.

Tekshirib ko'ring: new Date(1000) qaysi lahzani bildiradi?

Javob

Epoch'dan 1000 millisekund — ya'ni 1 soniya keyingi lahzani: 1970-01-01T00:00:01.000Z. Konstruktorga bitta son berilsa, u timestamp deb olinadi.

3. Sana yaratishning to'rt usuli

3.1 Argumentsiz — hozirgi lahza

js
const buyurtmaVaqti = new Date();

console.log(buyurtmaVaqti instanceof Date); // true

new Date() — "hozir". Buyurtma berilganda vaqtni yozib qo'yish uchun aynan shu kerak. Lekin uning qiymati har ishga tushirishda boshqacha, shuning uchun darslarda uni chiqarmaymiz.

new so'zini unutmang. Konstruktor funksiya va new darsida ko'rgandik: Date() new siz chaqirilsa, obyekt emas, matn qaytaradi:

js
console.log(typeof Date(), typeof new Date()); // string object

Date() qaytargan matn bilan hisob-kitob qilib bo'lmaydi — unda getHours kabi metodlar yo'q.

3.2 Bitta son — timestamp

js
const sana = new Date(1791201600000);

console.log(sana); // 2026-10-05T12:00:00.000Z

Timestamp'lar bazada va serverlar orasida ko'p saqlanadi: son — ixcham, zonasiz, taqqoslash oson. Serverdan 1791201600000 kelsa, new Date(...) uni qaytadan sanaga aylantiradi.

3.3 Matn — ISO 8601 shaklida

js
const sana = new Date("2026-10-05T12:00:00Z");

console.log(sana.getTime()); // 1791201600000

getTime() sananing ichidagi sonni — timestamp'ni — qaytaradi. Ko'ryapsizmi: bu va oldingi misol aynan bitta lahza.

Matn bilan yaratish qulay, lekin eng xavfli usul. Qaysi matn qanday o'qilishi — alohida mavzu, uni keyingi darsda ko'ramiz. Hozircha qoida: faqat ISO shaklidagi matn bering (2026-10-05T12:00:00Z), 05.10.2026 kabi "o'zimizcha" yozuv emas. Nega — «Ko'p uchraydigan xatolar» bo'limida ko'rasiz.

3.4 Qismlar bilan — yil, oy, kun, soat

js
const ochilish = new Date(2026, 9, 5, 7, 0);

console.log(String(ochilish));

Konsolda:

text
Mon Oct 05 2026 07:00:00 GMT+0500 (Uzbekistan Standard Time)

Argumentlar tartibi: yil, oy, kun, soat, daqiqa, soniya, millisekund. Kerak bo'lmaganlari tashlab ketiladi va 0 deb olinadi (kun esa 1).

Bu usul sanani mahalliy vaqt bo'yicha yaratadi. new Date(2026, 9, 5, 7, 0) — "kompyuterim soati bo'yicha 5-oktabr, 07:00". Toshkentda bu UTC bo'yicha 02:00.

Endi 9 ga qarang. Oktabr — o'ninchi oy, lekin biz 9 yozdik. Bu — Date ning eng mashhur tuzog'i.

3.5 Oy 0 dan boshlanadi

Date da oylar massiv indeksi kabi sanaladi: yanvar — 0, fevral — 1, ..., dekabr — 11. Kun esa odatdagidek 1 dan.

Oy Date dagi raqami
Yanvar 0
Mart 2
Oktabr 9
Dekabr 11

Nega? 1995-yilda Java'dagi sana klassi shunday edi. Oy nomlarini massivdan olish qulay bo'lsin deb o'ylangan: OYLAR[sana.getMonth()]. Kun esa shunchaki son bo'lib qolgan. Bu nomuvofiqlik o'ttiz yildan beri xatolarga sabab bo'ladi.

Oy raqami 11 dan oshsa, Date xato bermaydi — keyingi yilga o'tadi:

js
console.log(String(new Date(2026, 12, 1)));

Konsolda:

text
Fri Jan 01 2027 00:00:00 GMT+0500 (Uzbekistan Standard Time)

Kimdir "12-oy" deb dekabrni nazarda tutgan edi, Date esa 2027-yil yanvarini yaratdi. Hech qanday ogohlantirish yo'q.

O'zingiz to'ldiring: 2026-yil 25-dekabrni yaratish uchun oy o'rniga yozasiz — new Date(2026, oy, 25).

Tekshirib ko'ring: Navro'z — 21-mart. new Date(2026, 3, 21) to'g'rimi?

Javob

Yo'q. 3 — aprel (yanvar 0, fevral 1, mart 2, aprel 3). To'g'risi — new Date(2026, 2, 21). Mart uchun 2.

4. Getterlar: sananing qismlarini olish

4.1 Asosiy getterlar

Getter — "ol" metodlari: sananing ichidagi timestamp'dan bitta qismni hisoblab beradi. Hammasi get bilan boshlanadi:

js
const sana = new Date("2026-10-05T12:00:00Z");

console.log(sana.getFullYear()); // 2026
console.log(sana.getMonth()); // 9
console.log(sana.getDate()); // 5
console.log(sana.getHours()); // 17
console.log(sana.getMinutes()); // 0
console.log(sana.getSeconds()); // 0
console.log(sana.getMilliseconds()); // 0

Hammasi mahalliy vaqt bo'yicha. Sana UTC'da 12:00, getHours() esa 17 qaytardi — Toshkent soati. UTC bo'yicha qismlar uchun alohida getUTCHours() kabi getterlar bor, ularni keyingi darsda ko'ramiz.

getMonth() yana 9 — oktabr. Odamga ko'rsatish uchun + 1 qilish yoki nomini massivdan olish kerak.

4.2 getDate va getDay — ikki xil narsa

Nomlari o'xshash, ma'nosi butunlay boshqa:

  • getDate() — oyning kuni: 1 dan 31 gacha;
  • getDay() — haftaning kuni: 0 dan 6 gacha, va 0 — yakshanba.
js
const sana = new Date("2026-10-05T12:00:00Z");
const KUNLAR = [
  "yakshanba", "dushanba", "seshanba", "chorshanba",
  "payshanba", "juma", "shanba",
];

console.log(sana.getDate()); // 5
console.log(sana.getDay()); // 1
console.log(KUNLAR[sana.getDay()]); // dushanba

Hafta yakshanbadan boshlanishi — AQSh odati. O'zbekistonda hafta dushanbadan boshlanadi, lekin getDay() buni bilmaydi. Massivni tuzganda yakshanbani birinchi yozing.

4.3 getTime va boshqa yo'llar bilan son olish

Timestamp'ni olishning bir necha yo'li bor va hammasi bir xil son beradi:

js
const sana = new Date("2026-10-05T12:00:00Z");

console.log(sana.getTime()); // 1791201600000
console.log(sana.valueOf()); // 1791201600000
console.log(Number(sana)); // 1791201600000
console.log(+sana); // 1791201600000

valueOf, Number(...) va unar + — coercion darsidagi "number ishora". Kod o'qiydigan odam uchun eng aniq yozuv — getTime(): u "bu yerda timestamp kerak" deb ochiq aytadi.

Diqqat: getYear() degan eski metod ham bor. U 2026 emas, 126 qaytaradi — yildan 1900 ni ayirib. U faqat eski kod bilan moslik uchun saqlangan. Har doim getFullYear() yozing.

Tekshirib ko'ring: new Date("2026-10-05T12:00:00Z").getDay() nega 5 emas?

Javob

getDay() oyning kunini emas, haftaning kunini beradi: 2026-yil 5-oktabr — dushanba, ya'ni 1. Oyning kuni (5) — getDate().

5. Setterlar: sanani o'zgartirish

5.1 Setter sanani joyida o'zgartiradi

Har getterning juftligi bor — setter ("o'rnat" metodi, nomi set bilan boshlanadi): setFullYear, setMonth, setDate, setHours, setMinutes, setSeconds, setMilliseconds. Ular sananing bir qismini o'zgartiradi:

js
const yopilish = new Date(2026, 9, 5, 7, 0);
yopilish.setHours(23);

console.log(String(yopilish));

Konsolda:

text
Mon Oct 05 2026 23:00:00 GMT+0500 (Uzbekistan Standard Time)

Muhimi — setter yangi sana qaytarmaydi. U mavjud obyektning ichidagi timestamp'ni almashtiradi. Massivdagi push kabi: Pure funksiya va side effect darsi tili bilan aytsak, bu side effect.

const bu yerda yordam bermaydi. const faqat o'zgaruvchiga boshqa obyekt berishni taqiqlaydi, obyektning ichini emas. Massiv va obyektlar bilan ham shunday edi.

Setter qaytaradigan qiymat ham kutilmagan — u yangi timestamp, ya'ni son:

js
const sana = new Date(2026, 9, 5);

console.log(sana.setDate(6)); // 1791226800000

Shuning uchun const ertaga = sana.setDate(6) yozsangiz, ertaga sana emas, son bo'lib qoladi.

5.2 Toshib ketish: Date o'zi to'g'rilaydi

Setterlarga "noto'g'ri" qiymat berish mumkin — Date uni keyingi oy yoki yilga o'tkazadi. Bu ba'zan foydali:

js
const bron = new Date(2026, 9, 5);
bron.setDate(bron.getDate() + 30);

console.log(String(bron));

Konsolda:

text
Wed Nov 04 2026 00:00:00 GMT+0500 (Uzbekistan Standard Time)

5 + 30 = 35-oktabr. Oktabrda 31 kun bor, shuning uchun Date uni 4-noyabrga aylantirdi. "30 kundan keyin qaysi sana?" degan savolga shu bilan javob beriladi.

Xuddi shu mexanizm bilan oyning oxirgi kunini topish mumkin. 0-kun — "oldingi oyning oxirgi kuni":

js
console.log(new Date(2026, 2, 0).getDate()); // 28
console.log(new Date(2028, 2, 0).getDate()); // 29
console.log(new Date(2026, 10, 0).getDate()); // 31

new Date(2026, 2, 0) — "2026-yil martining 0-kuni", ya'ni fevralning oxirgi kuni. 2026-yilda fevral 28 kunlik, 2028-yil esa kabisa — 29 kun. Uchinchisi — oktabr: 10 noyabr, uning 0-kuni — 31-oktabr.

5.3 Toshib ketish tuzog'i: "31-yanvar + 1 oy"

Endi Sardorning uchinchi vazifasi — obuna to'lovi. Mehmon 31-yanvarda to'ladi, keyingi to'lov "bir oydan keyin" bo'lishi kerak. Sardor setMonth ni ishlatdi.

Qadamma-qadam qarang. O'ngda o'zgaruvchi qiymati va konsol:

"Bir oydan keyin" 28-fevral bo'lishi kerak edi, Date esa 3-martni berdi. Mehmon bir oy uchun to'lagan, tizim esa uni fevralni butunlay "sakratib" yubordi. Bunday xato faqat oyning oxirgi kunlarida chiqadi — shuning uchun testda sezilmay, haqiqiy foydalanuvchida ochiladi.

Tuzatish: kunni oyning oxiri bilan chegaralash. Yuqoridagi "0-kun" usuli bilan:

js
function oyQosh(sana, oylar) {
  const natija = new Date(sana);
  const kun = natija.getDate();
  natija.setDate(1);
  natija.setMonth(natija.getMonth() + oylar);
  const oxirgiKun = new Date(
    natija.getFullYear(), natija.getMonth() + 1, 0,
  ).getDate();
  natija.setDate(Math.min(kun, oxirgiKun));
  return natija;
}

const tolov = new Date(2026, 0, 31);
console.log(oyQosh(tolov, 1).getDate()); // 28
console.log(tolov.getDate()); // 31

Qadamlar:

  1. new Date(sana) — nusxa olamiz (nega — keyingi bo'limda).
  2. Kunni (31) eslab qolamiz.
  3. Avval 1-kunga o'tamiz — 1-fevral hamma oyda bor, toshib ketmaydi.
  4. Oyni suramiz: 1-fevral.
  5. Yangi oyning oxirgi kunini "0-kun" usuli bilan topamiz: 28.
  6. Eslab qolgan kun (31) va oy oxiri (28) dan kichigini qo'yamiz — Math.min.

Ko'rib turibsiz — oddiy savol uchun 10 qator. Temporal'da xuddi shu ish bitta metod bilan qilinadi — Temporal API darsida.

5.4 Sanadan nusxa olish

oyQosh ning birinchi qatoriga qarang: new Date(sana). Konstruktorga boshqa sana berilsa, u yangi obyekt yaratadi — o'sha lahza bilan. Shuning uchun funksiya ichidagi setterlar tashqaridagi tolov ga tegmadi: oxirgi qatorda tolov.getDate() hamon 31.

Nusxasiz yozilganda nima bo'lishini ko'ring:

js
function ertagaXato(sana) {
  sana.setDate(sana.getDate() + 1);
  return sana;
}

const bugun = new Date(2026, 9, 5);
const ertaga = ertagaXato(bugun);

console.log(bugun.getDate(), ertaga.getDate()); // 6 6
console.log(bugun === ertaga); // true

Funksiya "ertangi kunni hisoblab berdi", lekin yo'l-yo'lakay bugun ni ham buzdi. Ikkalasi — bitta obyekt.

Sayoz va chuqur nusxalash darsida structuredClone sanani ham to'g'ri nusxalashini ko'rgandik — u ham ishlaydi. Bitta sana uchun esa new Date(sana) qisqaroq.

Tekshirib ko'ring: const ochilish = new Date(2026, 9, 5, 7); const yopilish = ochilish; yopilish.setHours(23); — ochilish.getHours() nechchi?

Javob

23. yopilish = ochilish nusxa olmaydi — ikkala o'zgaruvchi bitta obyektga qaraydi. Setter shu obyektni o'zgartirdi. To'g'risi: const yopilish = new Date(ochilish);.

6. Sanalar bilan hisob

6.1 Ayirish — millisekundlar

Ikki sanani ayirsangiz, JavaScript ularni timestamp'ga aylantiradi va ayirmani millisekundda beradi:

js
const ochilish = new Date(2026, 9, 5, 7, 0);
const yopilish = new Date(2026, 9, 5, 23, 0);
const farq = yopilish - ochilish;

console.log(farq); // 57600000
console.log(farq / (60 * 60 * 1000)); // 16

«Bahor» kuniga 16 soat ishlaydi. 60 * 60 * 1000 — bir soatdagi millisekundlar. Bunday hisoblar va ularning tuzoqlari (masalan, kunlar sonini hisoblash) — keyingi darsda.

6.2 Qo'shish — matn

Yashirin coercion darsida va'da qilgandik: Date — istisno. U + da son emas, matn bo'ladi:

js
const sana = new Date("2026-10-05T12:00:00Z");

console.log(sana + 1);
console.log(sana - 1); // 1791201599999

Konsolda:

text
Mon Oct 05 2026 17:00:00 GMT+0500 (Uzbekistan Standard Time)1
1791201599999

Nega? + ikki ish qiladi: sonlarni qo'shadi va matnlarni yopishtiradi. Obyekt bilan uchrashganda u "son yoki matn — qaysi biri bo'lsang ham mayli" deydi (coercion darsidagi "default" ishora). Ko'p obyekt bunda son tomonni (valueOf) tanlaydi. Date esa ataylab matnni tanlaydi — buni Well-known symbols darsidagi Symbol.toPrimitive belgilaydi. - esa faqat sonlar uchun, shuning uchun u timestamp'ni oldi.

Qoida: sanaga vaqt qo'shish kerak bo'lsa, + emas — getTime() yoki setter.

js
const sana = new Date("2026-10-05T12:00:00Z");
const birSoatdanKeyin = new Date(sana.getTime() + 60 * 60 * 1000);

console.log(birSoatdanKeyin); // 2026-10-05T13:00:00.000Z

6.3 Taqqoslash: < ishlaydi, === — yo'q

js
const a = new Date("2026-10-05T12:00:00Z");
const b = new Date("2026-10-05T12:00:00Z");

console.log(a < b, a <= b); // false true
console.log(a === b, a == b); // false false
console.log(a.getTime() === b.getTime()); // true

< va > sanalarni sonlarga aylantirib solishtiradi — to'g'ri ishlaydi. === va == esa ikki obyektni solishtiradi: ular bitta obyektmi? a va b — ikki xil obyekt, lahzasi bir xil bo'lsa ham. Tenglikni tekshirish uchun — getTime().

Tekshirib ko'ring: new Date(2026, 9, 5) - new Date(2026, 8, 5) nechchi kun?

Javob

Natija millisekundda: 2592000000. Uni bir kundagi millisekundlarga (24 * 60 * 60 * 1000 = 86400000) bo'lsak, 30 chiqadi. Sentabrda 30 kun bor.

7. Invalid Date — noto'g'ri sana

Date noto'g'ri qiymatda xato tashlamaydi. U "noto'g'ri sana" obyektini yaratadi va jim ishlashda davom etadi:

js
const sana = new Date("5-oktabr 2026");

console.log(String(sana)); // Invalid Date
console.log(sana.getTime()); // NaN
console.log(sana.getFullYear()); // NaN

Ichidagi son — NaN (Matn ↔ son darsidagi "son emas"). Hamma getter ham NaN qaytaradi. Xato hech qayerda chiqmaydi — NaN sahifaga "NaN-NaN-NaN" bo'lib chiqqanda bilinadi.

Faqat bitta metod baland ovozda xato beradi — toISOString:

js
const sana = new Date("5-oktabr 2026");
console.log(sana.toISOString());
text
RangeError: Invalid time value

Tarjimasi: "Noto'g'ri vaqt qiymati." Range — "diapazon": sana ruxsat etilgan qiymatlar oralig'idan tashqarida. Serverga sana yuborishdan oldin uni ISO matnga aylantirasiz — shu yerda xato birinchi bo'lib chiqadi.

Sana to'g'riligini oldindan tekshirish:

js
function sanaTogrimi(sana) {
  return sana instanceof Date && !Number.isNaN(sana.getTime());
}

console.log(sanaTogrimi(new Date("2026-10-05T12:00:00Z"))); // true
console.log(sanaTogrimi(new Date("5-oktabr 2026"))); // false

Number.isNaN — Matn ↔ son darsidan. instanceof Date tekshiruvi esa funksiyaga umuman sana bo'lmagan narsa berilsa (masalan, matn) himoya qiladi.

Date ning chegarasi ham bor: epoch'dan ikki tomonga 8.64 × 10¹⁵ millisekund, taxminan 275 ming yil. Undan uzoq sana — ham Invalid Date. Amalda bu chegaraga faqat xato hisob-kitob yetadi.

Tekshirib ko'ring: new Date("abc") == "Invalid Date" nima beradi?

Javob

true — == obyektni matnga aylantirib solishtirdi. Lekin bunday tekshiruvga tayanmang: matn brauzer tiliga yoki versiyaga qarab o'zgarishi mumkin. Ishonchli usul — Number.isNaN(sana.getTime()).

8. "Hozir" — funksiya parametri

Pure funksiya darsida aytgandik: joriy vaqtni o'qiydigan funksiya bugun bir natija, ertaga boshqa natija beradi. Uni tekshirish ham qiyin — "ochiq" holatini ko'rish uchun soat 10 ni, "yopiq" uchun yarim tunni kutish kerakmi?

Yechim: "hozir"ni funksiyaning ichida emas, tashqarida oling va parametr qilib bering:

js
function ochiqmi(sana) {
  const soat = sana.getHours();
  return soat >= 7 && soat < 23;
}

console.log(ochiqmi(new Date(2026, 9, 5, 6, 59))); // false
console.log(ochiqmi(new Date(2026, 9, 5, 7, 0))); // true
console.log(ochiqmi(new Date(2026, 9, 5, 22, 59))); // true
console.log(ochiqmi(new Date(2026, 9, 5, 23, 0))); // false

Endi ochiqmi — pure funksiya: bir xil sana — bir xil javob. Istalgan vaqtni bir zumda tekshirsa bo'ladi. Saytda esa uni ochiqmi(new Date()) deb chaqirasiz — "hozir" faqat chaqiruv joyida.

soat < 23 ga e'tibor bering: 23:00 da «Bahor» allaqachon yopiq. Chegaralarni har doim alohida sinang — 06:59, 07:00, 22:59, 23:00. Ko'p xato aynan chegarada yashaydi.

Diqqat: getHours() mehmon kompyuterining soatini oladi. Toshkentdagi mehmon uchun bu to'g'ri. Moskvadan saytga kirgan odam esa Moskva soatini ko'radi va «Bahor» undan bir soat "kech" ochiladi. Choyxona esa Toshkent soati bilan ishlaydi. Buni qanday hal qilish — Date va vaqt zonalari darsida.

9. Ko'p uchraydigan xatolar

9.1 Oyni 1 dan sanash

new Date(2026, 10, 5) — 5-noyabr, oktabr emas. getMonth() ham oktabrda 9 qaytaradi. Tuzatish: qismlar bilan yaratganda oyga - 1, ko'rsatganda + 1 yoki nomlar massivi. Kod o'quvchisi uchun izoh qoldiring: new Date(2026, 9, 5) // 5-oktabr.

9.2 getDay ni oy kuni deb o'ylash

getDay() — hafta kuni (0 — yakshanba), getDate() — oy kuni. Sahifada "1-oktabr" o'rniga "4-oktabr" chiqsa, ko'pincha shu. Tuzatish: nomlarni eslab qolish usuli — Date (sana) → oy kuni, Day (kun nomi) → hafta kuni.

9.3 Setter natijasini sana deb olish

js
const sana = new Date(2026, 9, 5);
const ertaga = sana.setDate(6);
console.log(ertaga.getDate());
text
TypeError: ertaga.getDate is not a function

Tarjimasi: "ertaga.getDate funksiya emas." setDate timestamp — sonni — qaytardi, sonda esa getDate metodi yo'q. Tuzatish: avval nusxa oling, keyin nusxaga setter qo'llang va nusxaning o'zini ishlating.

9.4 05.10.2026 ni berish

O'zbekistonda sana ko'pincha 05.10.2026 deb yoziladi. Date esa bu matnni boshqacha tushunadi:

js
console.log(String(new Date("05.10.2026")));

Konsolda:

text
Sun May 10 2026 00:00:00 GMT+0500 (Uzbekistan Standard Time)

5-oktabr emas — 10-may! Chrome va Node ichida bitta dvigatel — V8 (JavaScript'ni bajaradigan dastur, 08-qismda tanishgansiz). U bu matnni AQSh tartibida — "oy.kun.yil" deb o'qidi. Boshqa brauzer uni Invalid Date deb qaytarishi ham mumkin: standart ISO bo'lmagan matnlar uchun hech narsa kafolatlamaydi. Tuzatish: foydalanuvchi yozgan sanani o'zingiz bo'laklarga ajrating (masalan, RegExp bilan) va new Date(yil, oy - 1, kun) qiling. HTML'dagi <input type="date"> esa qiymatni doim ISO shaklida beradi — 2026-10-05.

9.5 Sanani === bilan solishtirish

new Date(x) === new Date(x) — har doim false, chunki ikkita obyekt. Tuzatish: a.getTime() === b.getTime().

10. Mashqlar

1-mashq (oson): Oy nomi

oyNomi(sana) funksiyasi sananing oyini o'zbekcha nom bilan qaytarsin. Ishora: 12 ta nomdan iborat massiv va getMonth() — u indeks bo'lib xizmat qiladi.

js
console.log(oyNomi(new Date(2026, 9, 5))); // oktabr
console.log(oyNomi(new Date(2026, 0, 1))); // yanvar
Yechim
js
const OYLAR = [
  "yanvar", "fevral", "mart", "aprel", "may", "iyun",
  "iyul", "avgust", "sentabr", "oktabr", "noyabr", "dekabr",
];

function oyNomi(sana) {
  return OYLAR[sana.getMonth()];
}

console.log(oyNomi(new Date(2026, 9, 5))); // oktabr
console.log(oyNomi(new Date(2026, 0, 1))); // yanvar

Oy 0 dan boshlangani bu yerda foydali: getMonth() to'g'ridan-to'g'ri massiv indeksi. Shu sababli + 1 kerak emas.

2-mashq (o'rta): Bron vaqti

«Bahor» bronlarni 10:00 dan 22:00 gacha qabul qiladi: 10:00 — mumkin, 22:00 — mumkin, 22:01 — yo'q. bronMumkinmi(sana) shuni tekshirsin. Ishora: soat va daqiqani bitta songa aylantiring — soat * 60 + daqiqa (yarim tundan beri o'tgan daqiqalar).

js
console.log(bronMumkinmi(new Date(2026, 9, 5, 9, 59))); // false
console.log(bronMumkinmi(new Date(2026, 9, 5, 10, 0))); // true
console.log(bronMumkinmi(new Date(2026, 9, 5, 22, 0))); // true
console.log(bronMumkinmi(new Date(2026, 9, 5, 22, 1))); // false
Yechim
js
function bronMumkinmi(sana) {
  const daqiqa = sana.getHours() * 60 + sana.getMinutes();
  return daqiqa >= 10 * 60 && daqiqa <= 22 * 60;
}

console.log(bronMumkinmi(new Date(2026, 9, 5, 9, 59))); // false
console.log(bronMumkinmi(new Date(2026, 9, 5, 10, 0))); // true
console.log(bronMumkinmi(new Date(2026, 9, 5, 22, 0))); // true
console.log(bronMumkinmi(new Date(2026, 9, 5, 22, 1))); // false

Faqat getHours() ni tekshirsak, 22:30 ham "22-soat" bo'lib o'tib ketardi. Daqiqalarga aylantirish ikki sonni bitta bilan solishtirish imkonini beradi. Bu yerda chegara <= — 22:00 ning o'zi ruxsat etilgan.

3-mashq (qiyin): Keyingi dushanba

«Bahor» har dushanba yangi menyu e'lon qiladi. keyingiDushanba(sana) berilgan sanadan keyingi eng yaqin dushanbani yangi Date qilib qaytarsin (sana dushanba bo'lsa — bir hafta keyingisi). Asl sana o'zgarmasin. Ishora: getDay() da dushanba — 1; nusxa — new Date(sana); kun qo'shish — setDate(getDate() + n).

js
const bugun = new Date(2026, 9, 7);
console.log(keyingiDushanba(bugun).getDate()); // 12
console.log(bugun.getDate()); // 7
Yechim
js
function keyingiDushanba(sana) {
  const natija = new Date(sana);
  const qadam = ((1 - natija.getDay() + 7) % 7) || 7;
  natija.setDate(natija.getDate() + qadam);
  return natija;
}

const bugun = new Date(2026, 9, 7);
console.log(keyingiDushanba(bugun).getDate()); // 12
console.log(bugun.getDate()); // 7
console.log(keyingiDushanba(new Date(2026, 9, 5)).getDate()); // 12
console.log(keyingiDushanba(new Date(2026, 9, 31)).getDate()); // 2

7-oktabr — chorshanba (3). (1 - 3 + 7) % 7 = 5 kun qo'shiladi → 12-oktabr. Dushanbaning o'zida formula 0 beradi, || 7 uni bir haftaga almashtiradi. 31-oktabr misolida setDate toshib ketishi o'zi noyabrga o'tkazdi — 2-noyabr. Nusxa tufayli bugun o'zgarmadi.

4-mashq: Vazifalar qadami — vaqt belgilari

vazifalar ilovasi hozircha sanalarni saqlamaydi, shuning uchun uning kodiga tegmaymiz. Avval sanalarni alohida faylda sinab ko'ramiz. kurs/mashqlar/12/11-sana/vaqt-belgisi.mjs faylini yarating. Unda vazifalar timestamp bilan berilgan. Ularni yaratilgan vaqti bo'yicha tartiblab, har birining yonida soat:daqiqa ni chiqaring. Ishora: toSorted yoki sort va padStart(2, "0") — 7 ni 07 qiladi.

js
const vazifalar = [
  { matn: "Non olish", yaratilgan: 1791201600000 },
  { matn: "3 kg un olish", yaratilgan: 1791178200000 },
  { matn: "Choy damlash", yaratilgan: 1791189000000 },
];
Yechim
js
const vazifalar = [
  { matn: "Non olish", yaratilgan: 1791201600000 },
  { matn: "3 kg un olish", yaratilgan: 1791178200000 },
  { matn: "Choy damlash", yaratilgan: 1791189000000 },
];

function soatDaqiqa(timestamp) {
  const sana = new Date(timestamp);
  const soat = String(sana.getHours()).padStart(2, "0");
  const daqiqa = String(sana.getMinutes()).padStart(2, "0");
  return `${soat}:${daqiqa}`;
}

const tartiblangan = vazifalar.toSorted(
  (a, b) => a.yaratilgan - b.yaratilgan,
);
for (const vazifa of tartiblangan) {
  console.log(`${soatDaqiqa(vazifa.yaratilgan)} ${vazifa.matn}`);
}

Konsolda:

text
10:30 3 kg un olish
13:30 Choy damlash
17:00 Non olish

Timestamp — son, shuning uchun saralash oddiy ayirma bilan bo'ladi, Date obyekti kerak emas. Sana faqat ko'rsatishda yaratiladi. Real ilovalarda ham shunday: saqlash va saralash — son bilan, ko'rsatish — oxirida. Soatlar Toshkent vaqti bo'yicha. Terminalda: node 12/11-sana/vaqt-belgisi.mjs.

bash
git add 12/11-sana/vaqt-belgisi.mjs
git commit -m "12/11: vazifalarni timestamp bo'yicha tartibla"

11. Real ishda

  • Buyurtma va loglar. Har buyurtma, to'lov va xato logi timestamp bilan saqlanadi. Bazada odatda alohida sana turi bor, lekin JavaScript'ga u baribir Date yoki son bo'lib keladi.
  • Kesh va muddat. "Bu ma'lumot 10 daqiqa yangi" degan qoida — Date.now() - saqlanganVaqt < 10 * 60 * 1000. Token muddati, cookie muddati, kesh — hammasi timestamp bilan.
  • Testlar. Vaqtga bog'liq kodni test qilish uchun "hozir" parametr qilib beriladi yoki test kutubxonasi soatni "to'xtatib" qo'yadi. Testlarni Birinchi avtomatik test darsida yozamiz.
  • Intervyu. "getMonth() oktabrda nima qaytaradi?", "Ikki sanani qanday solishtirasiz?", "new Date('2026-02-30') nima beradi?" — junior intervyularida tez-tez so'raladi.
  • Kutubxonalar. Ko'p loyihalar Date ustiga qurilgan kutubxonalarni (date-fns, Day.js) ishlatadi. Ularni va yangi standart Temporal'ni Temporal API va sana kutubxonalari darsida ko'ramiz.

Xulosa

  • Date ichida bitta son — timestamp: epoch'dan (1970-01-01 00:00 UTC) beri o'tgan millisekundlar. Date.now() — hozirgisi.
  • Yaratish: new Date() — hozir, new Date(ms), new Date("ISO matn"), new Date(yil, oy, kun, ...) — mahalliy vaqtda.
  • Oy 0 dan (9 — oktabr), kun 1 dan; getDay() — hafta kuni, 0 — yakshanba.
  • Getterlar mahalliy vaqtda ishlaydi; setterlar sanani joyida o'zgartiradi va timestamp qaytaradi — avval new Date(sana) bilan nusxa oling.
  • Toshib ketish: 35-oktabr → 4-noyabr, 0-kun → oldingi oy oxiri; "31-yanvar + 1 oy" esa 3-mart beradi.
  • Noto'g'ri sana — Invalid Date, ichida NaN; tekshiruv — Number.isNaN(sana.getTime()). Solishtirish — getTime() bilan.

Keyingi dars: Date va vaqt zonalari — UTC va mahalliy vaqt farqi, ISO 8601, "2026-10-05" nega UTC deb o'qilishi va Moskvadagi mehmon uchun «Bahor» ish vaqtini to'g'ri ko'rsatish.

Manbalar

  • MDN: "Date", "Date.prototype.getDay", "Date.prototype.setMonth", "Date.now" — developer.mozilla.org
  • ECMAScript 2025 Language Specification, 21.4 "Date Objects" (Time Values and Time Range) — tc39.es/ecma262
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
JavaScript Date asoslari: sana yaratish, timestamp va getter/setterlar — IlmHamroh