Mundarija (41)
- Bu darsda
- 1. Nega bu kerak?
- 2. Date ichida nima bor
- 2.1 Bitta son: timestamp
- 2.2 Epoch'ning o'zi va hozirgi lahza
- 2.3 Node va brauzer Date ni har xil ko'rsatadi
- 3. Sana yaratishning to'rt usuli
- 3.1 Argumentsiz — hozirgi lahza
- 3.2 Bitta son — timestamp
- 3.3 Matn — ISO 8601 shaklida
- 3.4 Qismlar bilan — yil, oy, kun, soat
- 3.5 Oy 0 dan boshlanadi
- 4. Getterlar: sananing qismlarini olish
- 4.1 Asosiy getterlar
- 4.2 getDate va getDay — ikki xil narsa
- 4.3 getTime va boshqa yo'llar bilan son olish
- 5. Setterlar: sanani o'zgartirish
- 5.1 Setter sanani joyida o'zgartiradi
- 5.2 Toshib ketish: Date o'zi to'g'rilaydi
- 5.3 Toshib ketish tuzog'i: "31-yanvar + 1 oy"
- 5.4 Sanadan nusxa olish
- 6. Sanalar bilan hisob
- 6.1 Ayirish — millisekundlar
- 6.2 Qo'shish — matn
- 6.3 Taqqoslash: < ishlaydi, === — yo'q
- 7. Invalid Date — noto'g'ri sana
- 8. "Hozir" — funksiya parametri
- 9. Ko'p uchraydigan xatolar
- 9.1 Oyni 1 dan sanash
- 9.2 getDay ni oy kuni deb o'ylash
- 9.3 Setter natijasini sana deb olish
- 9.4 05.10.2026 ni berish
- 9.5 Sanani === bilan solishtirish
- 10. Mashqlar
- 1-mashq (oson): Oy nomi
- 2-mashq (o'rta): Bron vaqti
- 3-mashq (qiyin): Keyingi dushanba
- 4-mashq: Vazifalar qadami — vaqt belgilari
- 11. Real ishda
- Xulosa
- Manbalar
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. Sananew Date(2026, 9, 5)yokinew Date("2026-10-05T12:00:00Z")bilan yaratiladi, qismlarigetFullYear(),getMonth(),getDate(),getHours()bilan olinadi. Ikki tuzoq: oy 0 dan boshlanadi (9 — oktabr), setterlar esa sanani joyida o'zgartiradi.
Bu darsda
Dateichida 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()vagetDay()tuzoqlariga tushmaysiz. - Setterlar bilan sanani surasiz va "31-yanvar + 1 oy = 3-mart" holatini tushuntira olasiz.
Invalid Dateni 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:
console.log(new Date(0)); // 1970-01-01T00:00:00.000ZOxiridagi 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:
const hozir = Date.now();
console.log(typeof hozir); // number
console.log(hozir > 1767225600000); // trueDate.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:
const sana = new Date("2026-10-05T12:00:00Z");
console.log(sana);
console.log(String(sana));Konsolda:
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:
Datemahalliy soatni kompyuter sozlamasidan oladi. Natijani zonadan qat'i nazar bir xil qilish yo'liniIntl.DateTimeFormatdarsida 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
const buyurtmaVaqti = new Date();
console.log(buyurtmaVaqti instanceof Date); // truenew 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:
console.log(typeof Date(), typeof new Date()); // string objectDate() qaytargan matn bilan hisob-kitob qilib bo'lmaydi — unda getHours kabi metodlar yo'q.
3.2 Bitta son — timestamp
const sana = new Date(1791201600000);
console.log(sana); // 2026-10-05T12:00:00.000ZTimestamp'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
const sana = new Date("2026-10-05T12:00:00Z");
console.log(sana.getTime()); // 1791201600000getTime() 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
const ochilish = new Date(2026, 9, 5, 7, 0);
console.log(String(ochilish));Konsolda:
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:
console.log(String(new Date(2026, 12, 1)));Konsolda:
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:
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()); // 0Hammasi 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.
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()]); // dushanbaHafta 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:
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); // 1791201600000valueOf, 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. U2026emas,126qaytaradi — yildan 1900 ni ayirib. U faqat eski kod bilan moslik uchun saqlangan. Har doimgetFullYear()yozing.
Tekshirib ko'ring:
new Date("2026-10-05T12:00:00Z").getDay()nega5emas?
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:
const yopilish = new Date(2026, 9, 5, 7, 0);
yopilish.setHours(23);
console.log(String(yopilish));Konsolda:
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:
const sana = new Date(2026, 9, 5);
console.log(sana.setDate(6)); // 1791226800000Shuning 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:
const bron = new Date(2026, 9, 5);
bron.setDate(bron.getDate() + 30);
console.log(String(bron));Konsolda:
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":
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()); // 31new 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:
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()); // 31Qadamlar:
new Date(sana)— nusxa olamiz (nega — keyingi bo'limda).- Kunni (
31) eslab qolamiz. - Avval 1-kunga o'tamiz — 1-fevral hamma oyda bor, toshib ketmaydi.
- Oyni suramiz: 1-fevral.
- Yangi oyning oxirgi kunini "0-kun" usuli bilan topamiz:
28. - 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:
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); // trueFunksiya "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:
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:
const sana = new Date("2026-10-05T12:00:00Z");
console.log(sana + 1);
console.log(sana - 1); // 1791201599999Konsolda:
Mon Oct 05 2026 17:00:00 GMT+0500 (Uzbekistan Standard Time)1
1791201599999Nega? + 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.
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.000Z6.3 Taqqoslash: < ishlaydi, === — yo'q
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:
const sana = new Date("5-oktabr 2026");
console.log(String(sana)); // Invalid Date
console.log(sana.getTime()); // NaN
console.log(sana.getFullYear()); // NaNIchidagi 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:
const sana = new Date("5-oktabr 2026");
console.log(sana.toISOString());RangeError: Invalid time valueTarjimasi: "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:
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"))); // falseNumber.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:
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))); // falseEndi 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 —Dateva 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
const sana = new Date(2026, 9, 5);
const ertaga = sana.setDate(6);
console.log(ertaga.getDate());TypeError: ertaga.getDate is not a functionTarjimasi: "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:
console.log(String(new Date("05.10.2026")));Konsolda:
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.
console.log(oyNomi(new Date(2026, 9, 5))); // oktabr
console.log(oyNomi(new Date(2026, 0, 1))); // yanvarYechim
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))); // yanvarOy 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).
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))); // falseYechim
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))); // falseFaqat 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).
const bugun = new Date(2026, 9, 7);
console.log(keyingiDushanba(bugun).getDate()); // 12
console.log(bugun.getDate()); // 7Yechim
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()); // 27-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.
const vazifalar = [
{ matn: "Non olish", yaratilgan: 1791201600000 },
{ matn: "3 kg un olish", yaratilgan: 1791178200000 },
{ matn: "Choy damlash", yaratilgan: 1791189000000 },
];Yechim
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:
10:30 3 kg un olish
13:30 Choy damlash
17:00 Non olishTimestamp — 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.
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
Dateyoki 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
Dateustiga qurilgan kutubxonalarni (date-fns, Day.js) ishlatadi. Ularni va yangi standart Temporal'ni Temporal API va sana kutubxonalari darsida ko'ramiz.
Xulosa
Dateichida 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, ichidaNaN; 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
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!