Keling, yangi oârnatilgan obyekt bilan tanishamiz: Date. U sana, vaqtni saqlaydi va sana/vaqtni boshqarish usullarini taqdim etadi.
Masalan, biz uni yaratish/oâzgartirish vaqtlarini saqlash, vaqtni oâlchash yoki faqat joriy sanani ekranga chiqarish uchun ishlatishimiz mumkin.
Yaratish
Yangi Sana obyektini yaratish uchun quyidagi argumentlardan biri bilan new Date() chaqiring:
new Date()-
Argumentlarsiz â joriy sana va vaqt uchun
Dateobyektini yarating:let now = new Date(); alert( now ); // joriy sana/vaqtni ko'rsatadi new Date(millisekundlar)-
1970-yil 1-yanvaridan keyin oâtgan millisekundalar soniyasiga (sekundiga 1/1000) teng boâlgan
Dateobyektini yarating UTC + 0.// 0 anglatadi 01.01.1970 UTC+0 let Jan01_1970 = new Date(0); alert( Jan01_1970 ); // endi 24 soat qo'shing, va 02.01.1970 UTC+0 oling let Jan02_1970 = new Date(24 * 3600 * 1000); alert( Jan02_1970 );1970 yil boshidan beri oâtgan millisekundalar soni vaqt tamgâasi deyiladi.
Bu sananing engil raqamli tasviri. Biz har doim
new Date(vaqt tamg'asi)yordamida vaqt tamgâasidan sana yaratishimiz va mavjudsanaobyektiniDate.getTime()usuli yordamida vaqt tamgâasiga aylantirishimiz mumkin (pastga qarang). new Date(datestring)-
Agar bitta argument boâlsa va u matn boâlsa, u holda
Date.parsealgoritmi bilan tahlil qilinadi (pastga qarang). new Date(datestring)-
If there is a single argument, and itâs a string, then it is parsed automatically. The algorithm is the same as
Date.parseuses, weâll cover it later.let date = new Date("2017-01-26"); alert(date); // Sananing vaqt qismi GMT yarim tunda deb qabul qilinadi va // kod ishlaydigan vaqt zonasiga muvofiq o'rnatiladi. // Shunday qilib, natija bo'lishi mumkin // Thu Yanvar 26 2017 11:00:00 GMT+1100 (Avstraliyaning Sharqiy yozgi vaqti) // yoki // Wed Yanvar 25 2017 16:00:00 GMT-0800 (Tinch okeanining standart vaqti) new Date(yil, oy, sana, saot, daqiqa, soniya, millisoniya)-
Belgilangan komponentlar bilan sanani mahalliy vaqt zonasida yarating. Faqat ikkita birinchi argument majburiydir.
Eslatma:
yil4 ta raqamdan iborat boâlishi kerak:2013yaxshi,98yoâq.- Oylarni hisoblash
0(yanvar) bilan boshlanadi,11gacha (dekabr). Sanaparametri aslida oyning kunidir, agar yoâq boâlsa,1qabul qilinadi.- Agar
soat/daqiqa/soniya/millisoniyaboâlmasa, ular0ga teng deb qabul qilinadi.
Masalan:
new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 Yanvar 2011, 00:00:00 new Date(2011, 0, 1); // bir xil, soat va boshqalar sukut bo'yicha 0 ga tengMinimal aniqlik 1 millisoniya (1/1000 soniya)):
let date = new Date(2011, 0, 1, 2, 3, 4, 567); alert( date ); // 1.01.2011, 02:03:04.567
Sana tarkibiy qismlariga kirish
Date obyektidan yil, oy va boshqalarga kirishning koâplab usullari mavjud. Ammo ularni toifalarga ajratganda osongina eslab qolish mumkin.
- getFullYear()
- Yilni olish (4 ta raqam)
- getMonth()
- Oyni olish, 0 dan 11 gacha.
- getDate()
- Oyning kunini olish, 1 dan 31 gacha, usulning nomi biroz gâalati koârinadi.
- getHours(), getMinutes(), getSeconds(), getMilliseconds()
- Tegishli vaqt komponentlarini olish.
getYear() emas, balki getFullYear()Koâpgina JavaScript interpretatorlari getYear() nostandart usulini qoâllaydilar. Ushbu usul eskirgan. Baâzan 2 raqamli yilni qaytaradi. Iltimos, uni hech qachon ishlatmang. Yil uchun getFullYear() usuli mavjud.
Bundan tashqari, biz haftaning bir kunini olishimiz mumkin:
- getDay()
- Haftaning kunini
0dan (yakshanba)6gacha (shanba) olish. Birinchi kun har doim yakshanba, baâzi mamlakatlarda bunday emas, lekin uni oâzgartirish mumkin emas.
Yuqoridagi barcha usullar komponentlarni mahalliy vaqt zonasiga nisbatan qaytaradi.
UTC+0 soat mintaqasi uchun qaytib keladigan kun, oy, yil va boshqalarning UTC-hamkasblari mavjud: getUTCFullYear(), getUTCMonth(), getUTCDay(). Faqat "get" dan keyin "UTC" ni qoâying.
Agar sizning mahalliy vaqt mintaqangiz UTC ga nisbatan oâzgargan boâlsa, unda quyidagi kod turli soatlarni koârsatadi:
// joriy sana
let date = new Date();
// joriy vaqt mintaqangizdagi soat
alert( date.getHours() );
// UTC+0 vaqt zonasidagi soat (London vaqti bilan)
alert( date.getUTCHours() );
Ushbu usullardan tashqari, UTC-variantiga ega boâlmagan ikkita maxsus usul mavjud:
- getTime()
-
Sana uchun vaqt tamgâasini qaytaradi â 1970 yil 1 yanvardan boshlab bir necha millisoniyalarda UTC+0.
- getTimezoneOffset()
-
Mahalliy vaqt zonasi va UTC oârtasidagi farqni daqiqada qaytaradi:
// agar siz UTC-1 vaqt mintaqasida bo'lsangiz, 60 qaytaradi // agar siz UTC+3 vaqt mintaqasida bo'lsangiz, -180 qaytaradi alert( new Date().getTimezoneOffset() );
Sana komponentlarini oârnatish
Quyidagi usullar sana/vaqt komponentlarini oârnatishga imkon beradi:
setFullYear(year, [month], [date])setMonth(month, [date])setDate(date)setHours(hour, [min], [sec], [ms])setMinutes(min, [sec], [ms])setSeconds(sec, [ms])setMilliseconds(ms)setTime(milliseconds)(01.01.1970 UTC dan boshlab butun sanani millisoniyalar bilan belgilaydi)
setTime() dan tashqari ularning har birida UTC-variant mavjud, masalan: setUTCHours().
Koârib turganimizdek, baâzi usullar bir vaqtning oâzida bir nechta komponentlarni oârnatishi mumkin, masalan setHours. Taâkidlanmagan komponentlar oâzgartirilmaydi.
Masalan:
let today = new Date();
today.setHours(0);
alert(today); // hali ham bugun, lekin soat 0 ga o'zgartirildi
today.setHours(0, 0, 0, 0);
alert(today); // hali bugun, endi 00:00:00.
Avtomatik tuzatish
Avtomatik tuzatish â bu Date obyektlarining juda qulay xususiyati. Biz diapazondan tashqari qiymatlarni oârnatishimiz mumkin va u oâzini avtomatik ravishda sozlaydi.
Masalan:
let date = new Date(2013, 0, 32); // 32 Yanvar 2013 ?!?
alert(date); // ...1 Fevral 2013!
Kundan tashqari sana komponentlari avtomatik ravishda tarqatiladi.
Aytaylik, â2016 yil 28-fevralâ sanasini 2 kunga oshirishimiz kerak. Oâtish yilida â2 Martâ yoki â1 Martâ boâlishi mumkin. Bu haqda oâylashning hojati yoâq. Faqat 2 kun qoâshing. Date obyekti qolgan ishlarni oâzi bajaradi:
let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);
alert( date ); // 1 Mart 2016
Ushbu xususiyat koâpincha maâlum vaqtdan keyin sanani olish uchun ishlatiladi. Masalan, â70 soniyadan keyinâ sanasini olaylik:
let date = new Date();
date.setSeconds(date.getSeconds() + 70);
alert( date ); // to'g'ri sanani ko'rsatadi
Bundan tashqari, nol yoki hatto salbiy qiymatlarni oârnatishimiz mumkin. Masalan:
let date = new Date(2016, 0, 2); // 2 Yanvar 2016
date.setDate(1); // oyning 1-kunini belgilandi
alert( date );
date.setDate(0); // minimal kun 1, shuning uchun o'tgan oyning oxirgi kuni qabul qilinadi
alert( date ); // 31 Dekabr 2015
Sanani raqamga, sana farqi
Date obyekti raqamga aylantirilganda, u date.getTime() bilan bir xil vaqt tamgâasiga aylanadi:
let date = new Date();
alert(+date); // millisoniyalar soni, xuddi shunday date.getTime()
Muhim yon taâsir: sanalarni olib tashlash mumkin, natijasi ularning millisoniyalar farqi.
Vaqtni oâlchash uchun ishlatilishi mumkin:
let start = new Date(); // hisoblashni boshlang
// ishni bajariladi
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = new Date(); // bajarildi
alert( `Tsikl ${end - start} millisoniyani oldi` );
Date.now()
Agar biz faqat farqni oâlchashni xohlasak, bizga Date obyekti kerak emas.
Joriy vaqt tamgâasini qaytaradigan Date.now() maxsus usuli mavjud.
Bu semantik jihatdan new Date().getTime() ga teng, ammo Date oraliq obyektini yaratmaydi. Shunday qilib, u tezroq va axlat yigâilishiga bosim oâtkazmaydi.
U asosan qulaylik uchun yoki ishlash vaqti muhim boâlgan hollarda, masalan JavaScript-dagi oâyinlarda yoki boshqa ixtisoslashtirilgan dasturlarda ishlatiladi.
Shunday qilib, ehtimol bu yaxshiroqdir:
let start = Date.now(); // millisoniyalar hisoblanadi from 1 Jan 1970
// ish bajariladi
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = Date.now(); // bajarildi
alert( `Tsikl ${end - start} millisoniyani oldi` ); // sanalarni emas, balki raqamlarni qisqartiradi
Benchmarking
Agar biz CPUga chalingan funktsiyaning ishonchli koârsatkichini xohlasak, ehtiyot boâlishimiz kerak.
Masalan, ikkita sana oârtasidagi farqni hisoblaydigan ikkita funktsiyani oâlchaymiz: qaysi biri tezroq?
Such performance measurements are often called âbenchmarksâ.
// Bizda date1 va date2 bor, qaysi funktsiya ularning farqini ms ga tezroq qaytaradi?
function diffSubtract(date1, date2) {
return date2 - date1;
}
// yoki
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
Bu ikkalasi aynan bir narsani qilishadi, lekin ulardan biri sana ms ni olish uchun aniq date.getTime() dan foydalanadi, ikkinchisi esa sanadan sanaga oâzgartirishga tayanadi. Ularning natijasi har doim bir xil boâladi.
Xoâsh, qaysi biri tezroq?
Birinchi gâoya ularni ketma-ket koâp marta ishlatish va vaqt farqini oâlchash boâlishi mumkin. Bizning ishimiz uchun funktsiyalar juda oddiy, shuning uchun biz buni 100000 marta bajarishimiz kerak.
Keling, oâlchov qilaylik:
function diffSubtract(date1, date2) {
return date2 - date1;
}
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
function bench(f) {
let date1 = new Date(0);
let date2 = new Date();
let start = Date.now();
for (let i = 0; i < 100000; i++) f(date1, date2);
return Date.now() - start;
}
alert( 'DiffSubtract vaqti: ' + bench(diffSubtract) + 'ms' );
alert( 'DiffGetTime vaqti: ' + bench(diffGetTime) + 'ms' );
Voy-buy! getTime() dan foydalanish juda tezroq! Buning sababi shundaki, hech qanday konvertatsiya mavjud emas, interpretatorlar uchun optimallashtirish juda oson.
Yaxshi, bizda bir narsa bor. Ammo bu hali yaxshi koârsatkich emas.
Tasavvur qiling-a, bench(diffSubtract) ishlayotganda protsessor parallel ravishda nimadir qilgan va u resurslardan foydalangan. Va bench(diffGetTime) ishlash tugagach, ish tugadi.
Zamonaviy koâp jarayonli OS uchun juda yaxshi stsenariy.
Natijada, birinchi etalonda ikkinchisiga qaraganda kamroq protsessor resurslari boâladi. Bu notoâgâri natijalarga olib kelishi mumkin.
Batafsil ishonchliligi uchun, barcha koârsatkichlar toâplami bir necha marta takrorlanishi kerak.
Mana kod misoli:
function diffSubtract(date1, date2) {
return date2 - date1;
}
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
function bench(f) {
let date1 = new Date(0);
let date2 = new Date();
let start = Date.now();
for (let i = 0; i < 100000; i++) f(date1, date2);
return Date.now() - start;
}
let time1 = 0;
let time2 = 0;
// bench(upperSlice) va bench(upperLoop) navbati bilan 10 marta ishlaydi
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
alert( 'DiffSubtract ning umumiy vaqti:' + time1 );
alert( 'DiffGetTime ning umumiy vaqti:: ' + time2 );
Zamonaviy JavaScript dvigatellari rivojlangan optimallashtirishni faqat koâp marta bajariladigan âissiq kodâ ga tatbiq etishni boshlaydilar (kamdan-kam bajariladigan narsalarni optimallashtirishga hojat yoâq). Shunday qilib, yuqoridagi misolda birinchi ishga tushirish toâgâri optimallashtirilmagan. âIsitishâ uchun dastlabki ishga tushirishni qoâshish foydali boâladi»:
// asosiy tsikldan oldin "isitish" uchun qo'shiildi
bench(diffSubtract);
bench(diffGetTime);
// va endi ishlashni sinab ko'ramiz
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
Zamonaviy JavaScript interpretatorlari koâplab optimallashtirishlarni amalga oshiradi. Ular âsunâiy sinovlarâ natijalarini âodatdagi foydalanishâ bilan taqqoslashlari mumkin, ayniqsa, biz juda kichik bir narsaga eâtibor qaratsak. Shunday qilib, agar siz ishlashni jiddiy tushunishni istasangiz, unda JavaScript-ni qanday ishlashini oârganing. Va keyin sizga mikrobenchmarklar umuman kerak boâlmaydi.
V8 haqidagi maqolalar toâplamini http://mrale.ph sahifasida topishingiz mumkin.
Date.parse matndan
Date.parse(str) usuli sanani matndan oâqishi mumkin.
Satr formati quyidagicha boâlishi kerak: YYYY-MM-DDTHH: mm: ss.sssZ, bu yerda:
YYYY-MM-DDâ sana: yil-oy-kun.- Ajratuvchi sifatida
"T"belgisi ishlatiladi. HH:mm:ss.sssâ vaqt: soat, daqiqa, soniya va millisoniyalar.- Ixtiyoriy
"Z"qismi soat mintaqasini+-hh:mmformatida bildiradi. UTC+0 degan maânoni anglatuvchi bitta"Z"harfi.
Shuningdek, YYYY-MM-DD yoki YYYY-MM yoki hatto YYYY kabi qisqaroq variantlar ham mavjud.
Date.parse(str) ni chaqiruvi matnni berilgan formatda ajrata oladi va vaqt tamgâasini qaytaradi (1970 yil 1 yanvardan boshlab UTC+0 millisoniyalar soni). Agar format yaroqsiz boâlsa, NaN ni qaytaradi.
Masalan:
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (vaqt tamg'asi)
Vaqt belgisidan darhol yangi Date obyektini yaratishimiz mumkin:
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );
alert(date);
Xulosa
- JavaScript-dagi sana va vaqt Sana obyekti bilan ifodalanadi. Biz âfaqat sanaâ yoki âfaqat vaqtâ ni yarata olmaymiz:
Dateobyektlari har doim ikkalasini ham oâz ichiga oladi. - Oylar noldan hisoblanadi (ha, yanvar â nolinchi oy).
- Haftaning kunlari
getDay()da noldan hisoblanadi (0 bu yakshanba). Datedoiradan tashqaridagi komponentlar oârnatilganda oâzini avtomatik ravishda tuzatadi. Kunlarni/oylarni/soatlarni qoâshish/olib tashlash uchun yaxshi.- Sanalarni qisqartirish mumkin, ularning farqlari millisoniyada. Buning sababi,
Sanaraqamga oâtkazilganda vaqt tamgâasiga aylanadi. - Joriy vaqt tamgâasini tezda olish uchun
Date.now()dan foydalaning.
Eâtibor bering, boshqa koâplab tizimlardan farqli oâlaroq, JavaScript-dagi vaqt tamgâalari bir necha soniyada emas, millisoniyada.
Bundan tashqari, baâzida biz aniqroq vaqt oâlchovlariga muhtojmiz. JavaScript-ning oâzida vaqtni mikrosoniyalarda (soniyaning 1 milliondan biri) oâlchash usuli yoâq, lekin koâpchilik muhitlar uni taâminlaydi. Masalan, brauzerda performance.now() bor, bu sahifani mikrosaniyadagi aniqlik bilan yuklash boshidan millisoniyalar sonini beradi (nuqtadan keyin 3 ta raqam):
alert(`Loading started ${performance.now()}ms ago`);
// Shunga o'xshash narsa: "Yuklash 34731.26000000001ms oldin boshlangan"
// .26 mikrosaniyadir (260 mikrosaniya)
// kasrdan 3 raqamdan keyin ko'pincha aniqlikdagi xatolar, ammo faqat dastlabki 3 ta si to'g'ri
Node.js-da microtime moduli va boshqa usullar mavjud. Texnik jihatdan har qanday qurilma va muhit yanada aniqroq ishlashga imkon beradi, bu faqat Date da emas.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)