ÐознайомÑеÑÑ Ð· новим вбÑдованим обâÑкÑом: Date. ÐÑн збеÑÑÐ³Ð°Ñ Ð´Ð°ÑÑ, ÑÐ°Ñ Ñ Ð½Ð°Ð´Ð°Ñ Ð¼ÐµÑоди Ð´Ð»Ñ ÑпÑавлÑÐ½Ð½Ñ Ð´Ð°ÑоÑ/ÑаÑом.
ÐапÑиклад, ми можемо викоÑиÑÑовÑваÑи його Ð´Ð»Ñ Ð·Ð±ÐµÑÑÐ³Ð°Ð½Ð½Ñ ÑаÑÑ ÑÑвоÑеннÑ/модиÑÑкаÑÑÑ, Ñоб вимÑÑÑÑи ÑаÑ, або пÑоÑÑо Ð´Ð»Ñ Ð´ÑÑÐºÑ Ð¿Ð¾ÑоÑÐ½Ð¾Ñ Ð´Ð°Ñи.
СÑвоÑеннÑ
Щоб ÑÑвоÑиÑи новий обâÑÐºÑ Date виклиÑемо new Date() з одним з наÑÑÑпниÑ
аÑгÑменÑÑв:
new Date()-
Ðез аÑгÑменÑÑв â ÑÑвоÑÑÑ Ð¾Ð±âÑкÑ
DateÐ´Ð»Ñ Ð¿Ð¾ÑоÑÐ½Ð¾Ñ Ð´Ð°Ñи Ñа ÑаÑÑ:let now = new Date(); alert( now ); // показÑÑ Ð¿Ð¾ÑоÑÐ½Ñ Ð´Ð°ÑÑ/ÑÐ°Ñ new Date(milliseconds)-
СÑвоÑÑÑ Ð¾Ð±âÑкÑ
Dateз ÑаÑом, Ñо доÑÑвнÑÑ ÐºÑлÑкоÑÑÑ Ð¼ÑлÑÑекÑнд (1/1000 ÑекÑнди), Ñо минÑли пÑÑÐ»Ñ 1 ÑÑÑÐ½Ñ 1970 UTC+0.// 0 ознаÑÐ°Ñ 01.01.1970 UTC+0 let Jan01_1970 = new Date(0); alert( Jan01_1970 ); // ÑÐµÐ¿ÐµÑ Ð´Ð¾Ð´Ð°Ð¼Ð¾ 24 години, оÑÑимаÑмо 02.01.1970 UTC+0 let Jan02_1970 = new Date(24 * 3600 * 1000); alert( Jan02_1970 );ЦÑле ÑиÑло, Ñке ÑвлÑÑ ÑÐ¾Ð±Ð¾Ñ ÐºÑлÑкÑÑÑÑ Ð¼ÑлÑÑекÑнд, Ñо пÑойÑли з поÑаÑÐºÑ 1970 ÑокÑ, називаÑÑÑÑÑ Ð¼ÑÑÐºÐ¾Ñ ÑаÑÑ (timestamp).
Це легке ÑиÑлове пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ñи. Ðи завжди можемо ÑÑвоÑиÑи даÑÑ Ð· timestamp за допомогоÑ
new Date(timestamp)Ñ Ð¿ÐµÑеÑвоÑиÑи обâÑкÑDate, Ñо ÑÑнÑÑ, до timestamp за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¼ÐµÑодÑdate.getTime()(див. нижÑе).ÐаÑи до 01.01.1970 Ñ. маÑÑÑ Ð½ÐµÐ³Ð°Ñивний timestamp, напÑиклад:
// 31 гÑÑÐ´Ð½Ñ 1969 ÑÐ¾ÐºÑ let Dec31_1969 = new Date(-24 * 3600 * 1000); alert( Dec31_1969 ); new Date(datestring)-
ЯкÑо Ñ Ñдиний аÑгÑменÑ, Ñ Ñе ÑÑдок, Ñо вÑн авÑомаÑиÑно аналÑзÑÑÑÑÑÑ. ÐлгоÑиÑм Ñой же, Ñо викоÑиÑÑовÑÑ
Date.parse, ми ÑозглÑнемо Ñе пÑзнÑÑе.let date = new Date("2017-01-26"); alert(date); // Ð§Ð°Ñ Ð½Ðµ вÑÑановлений, ÑÐ¾Ð¼Ñ Ð¿ÑипÑÑкаÑÑÑÑÑ, Ñо Ñе бÑде пÑвнÑÑ Ð·Ð° GMT Ñ // ÑегÑлÑÑÑÑÑÑ Ð²ÑдповÑдно до Ñого ÑаÑового поÑÑÑ, де запÑÑкаÑÑÑÑÑ ÐºÐ¾Ð´ // Ð¢Ð¾Ð¼Ñ ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ðµ бÑÑи // Thu Jan 26 2017 11:00:00 GMT+1100 (Australian Eastern Daylight Time) // або // Wed Jan 25 2017 16:00:00 GMT-0800 (Pacific Standard Time) new Date(year, month, date, hours, minutes, seconds, ms)-
СÑвоÑÑÑ Ð´Ð°ÑÑ Ð· заданими компоненÑами Ñ Ð¼ÑÑÑÐµÐ²Ð¾Ð¼Ñ ÑаÑÐ¾Ð²Ð¾Ð¼Ñ Ð¿Ð¾ÑÑÑ. ТÑлÑки пеÑÑÑ Ð´Ð²Ð° аÑгÑменÑи обовâÑзковÑ.
yearÐ¼Ð°Ñ Ð¼ÑÑÑиÑи 4 ÑиÑÑи. ÐÐ»Ñ ÑÑмÑÑноÑÑÑ Ñакож допÑÑкаÑÑÑÑÑ 2 ÑиÑÑи, ÑÐºÑ Ð²Ð²Ð°Ð¶Ð°ÑÑÑÑÑ19xx, напÑ.98ÑÑÑ Ñе Ñаме, Ñо й1998, але наÑÑÑйно ÑекомендÑÑÑÑÑÑ Ð·Ð°Ð²Ð¶Ð´Ð¸ викоÑиÑÑовÑваÑи 4 ÑиÑÑи.- РаÑ
Ñнок мÑÑÑÑÑв поÑинаÑÑÑÑÑ Ð·
0(ÑÑÑнÑ), до11(гÑÑднÑ). - ÐаÑамеÑÑ
dateнаÑпÑÐ°Ð²Ð´Ñ Ð´ÐµÐ½Ñ Ð¼ÑÑÑÑÑ, ÑкÑо вÑн вÑдÑÑÑнÑй, Ñо беÑеÑÑÑÑ1. - ЯкÑо
hours/minutes/seconds/msвÑдÑÑÑнÑ, вони вважаÑÑÑÑÑ ÑÑвними0.
ÐапÑиклад:
new Date(2011, 0, 1, 0, 0, 0, 0); // 1 ÑÑÑÐ½Ñ 2011 ÑокÑ, 00:00:00 new Date(2011, 0, 1); // Ñе ж Ñаме, години ÑоÑо -- 0 за замовÑÑваннÑмÐакÑималÑна ÑоÑнÑÑÑÑ ÑÑановиÑÑ 1 Ð¼Ñ (1/1000 Ñек):
let date = new Date(2011, 0, 1, 2, 3, 4, 567); alert( date ); // 1.01.2011, 02:03:04.567
ÐоÑÑÑп до компоненÑÑв даÑи
ÐÑнÑÑÑÑ Ð¼ÐµÑоди доÑÑÑÐ¿Ñ Ð´Ð¾ ÑокÑ, мÑÑÑÑÑ Ñ Ñак Ð´Ð°Ð»Ñ Ð· обâÑкÑа Date:
- getFullYear()
- ÐÑÑимаÑи ÑÑк (4 ÑиÑÑи)
- getMonth()
- ÐÑÑимаÑи мÑÑÑÑÑ, вÑд 0 до 11.
- getDate()
- ÐÑÑимаÑи Ð´ÐµÐ½Ñ Ð¼ÑÑÑÑÑ, вÑд 1 до 31, назва меÑÐ¾Ð´Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ð°Ñ ÑÑÐ¾Ñ Ð¸ дивно.
- getHours(), getMinutes(), getSeconds(), getMilliseconds()
- ÐÑÑимаÑи вÑдповÑÐ´Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñи ÑаÑÑ.
getYear(), а getFullYear()ÐагаÑо ÑÑÑÑÑв JavaScript ÑеалÑзÑÑÑÑ Ð½ÐµÑÑандаÑÑний меÑод getYear(). Цей меÑод заÑÑаÑÑлий. ÐÐ½Ð¾Ð´Ñ Ð²Ñн повеÑÑÐ°Ñ 2-знаÑний ÑÑк. ÐÑÐ´Ñ Ð»Ð°Ñка, не викоÑиÑÑовÑйÑе його. Щоб оÑÑимаÑи ÑÑк Ñ getFullYear().
ÐÑÑм Ñого, ми можемо оÑÑимаÑи Ð´ÐµÐ½Ñ ÑижнÑ:
- getDay()
- ÐÑÑимаÑи Ð´ÐµÐ½Ñ ÑижнÑ, вÑд
0(недÑлÑ) до6(ÑÑбоÑа). ÐеÑÑий Ð´ÐµÐ½Ñ Ð·Ð°Ð²Ð¶Ð´Ð¸ недÑлÑ, в деÑÐºÐ¸Ñ ÐºÑаÑÐ½Ð°Ñ Ñе не Ñак, але ми не можемо змÑниÑи поведÑÐ½ÐºÑ Ð¼ÐµÑодÑ.
ÐÑÑ Ð¼ÐµÑоди, Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ Ð²Ð¸Ñе, повеÑÑаÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñи вÑдноÑно мÑÑÑевого ÑаÑового поÑÑÑ.
Ð Ñакож ÑÑ
Ð½Ñ UTC-аналоги, Ñо повеÑÑаÑÑÑÑÑ Ð´ÐµÐ½Ñ, мÑÑÑÑÑ, ÑÑк Ñ Ñак Ð´Ð°Ð»Ñ Ð·Ð° ÑаÑовим поÑÑом UTC+0: getUTCFullYear(), getUTCMonth(), getUTCDay(). ÐÑоÑÑо вÑÑавÑе "UTC" вÑдÑÐ°Ð·Ñ Ð¿ÑÑÐ»Ñ "get".
ЯкÑо Ð²Ð°Ñ Ð¼ÑÑÑевий ÑаÑовий поÑÑ Ð·Ð¼ÑÑений вÑдноÑно UTC, Ñо код нижÑе показÑÑ ÑÑÐ·Ð½Ñ Ð³Ð¾Ð´Ð¸Ð½Ð¸:
// поÑоÑна даÑа
let date = new Date();
// години Ñ Ð¿Ð¾ÑоÑÐ½Ð¾Ð¼Ñ ÑаÑÐ¾Ð²Ð¾Ð¼Ñ Ð¿Ð¾ÑÑÑ
alert( date.getHours() );
// години Ñ ÑаÑовÑй Ð·Ð¾Ð½Ñ UTC+0 (ÐондонÑÑкий ÑÐ°Ñ Ð±ÐµÐ· лÑÑнÑÑ
пеÑеводÑв ÑаÑÑ)
alert( date.getUTCHours() );
ÐкÑÑм Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¼ÐµÑодÑв, Ñ Ð´Ð²Ð° ÑпеÑÑалÑÐ½Ð¸Ñ , ÑÐºÑ Ð½Ðµ маÑÑÑ UTC-ваÑÑанÑÑ:
- getTime()
-
ÐовеÑÑÐ°Ñ timestamp Ð´Ð»Ñ Ð´Ð°Ñи â кÑлÑкÑÑÑÑ Ð¼ÑлÑÑекÑнд, Ñо пÑойÑли з 1 ÑÑÑÐ½Ñ 1970 UTC+0.
- getTimezoneOffset()
-
ÐовеÑÑÐ°Ñ ÑÑзниÑÑ Ð¼Ñж UTC Ñа мÑÑÑевим ÑаÑовим поÑÑом, Ñ Ñ Ð²Ð¸Ð»Ð¸Ð½Ð°Ñ :
// ÑкÑо ви Ð·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑеÑÑ Ð² ÑаÑÐ¾Ð²Ð¾Ð¼Ñ Ð¿Ð¾ÑÑÑ UTC-1 -- видаÑÑÑ 60 // ÑкÑо ви Ð·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑеÑÑ Ð² ÑаÑÐ¾Ð²Ð¾Ð¼Ñ Ð¿Ð¾ÑÑÑ UTC+3 -- видаÑÑÑ -180 alert( new Date().getTimezoneOffset() );
ÐалаÑÑÑÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑв даÑи
ÐаÑÑÑÐ¿Ð½Ñ Ð¼ÐµÑоди дозволÑÑÑÑ Ð²ÑÑановиÑи даÑÑ/ÑаÑÐ¾Ð²Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñи:
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)
Ðожен з ниÑ
, кÑÑм setTime() Ð¼Ð°Ñ UTC-аналог, напÑиклад: setUTCHours().
Як ми баÑимо, деÑÐºÑ Ð¼ÐµÑоди можÑÑÑ Ð²ÑÑановиÑи кÑлÑка компоненÑÑв вÑдÑазÑ, напÑиклад setHours. ÐомпоненÑи даÑи/ÑаÑÑ, ÑÐºÑ Ð½Ðµ згадÑÑÑÑÑÑ, â не модиÑÑкÑÑÑÑÑÑ.
ÐапÑиклад:
let today = new Date();
today.setHours(0);
alert(today); // Ñе ÑÑогоднÑ, але година змÑнÑÑÑÑÑÑ Ð½Ð° 0
today.setHours(0, 0, 0, 0);
alert(today); // Ñе ÑÑогоднÑ, заÑаз ÑÑвно 00:00:00.
ÐвÑокоÑекÑÑÑ
ÐвÑокоÑекÑÑÑ â Ñе дÑже зÑÑÑна оÑобливÑÑÑÑ Ð¾Ð±âÑкÑÑв Date. Ðи можемо вÑÑановиÑи Ð´Ð°Ð½Ð½Ñ Ð·Ð° межами дÑапазонÑ, Ñ Ð²Ð¾Ð½Ð¸ бÑдÑÑÑ Ð°Ð²ÑомаÑиÑно налаÑÑÑваÑи Ñебе.
ÐапÑиклад:
let date = new Date(2013, 0, 32); // 32 ÑÑÑÐ½Ñ 2013 ?!?
alert(date); // ...Ñе 1 лÑÑого 2013!
ÐомпоненÑи поза межами дÑÐ°Ð¿Ð°Ð·Ð¾Ð½Ñ ÑозподÑлÑÑÑÑÑÑ Ð°Ð²ÑомаÑиÑно.
СкажÑмо, нам поÑÑÑбно збÑлÑÑиÑи даÑÑ â28 лÑÑого 2016â на 2 днÑ. Це може бÑÑи â2 беÑезнÑâ або â1 беÑезнÑâ Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð²Ð¸ÑокоÑного ÑокÑ. Ðам не поÑÑÑбно дÑмаÑи пÑо Ñе. ÐÑоÑÑо додайÑе 2 днÑ. ÐбâÑÐºÑ Date зÑобиÑÑ Ð²Ñе ÑнÑе:
let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);
alert( date ); // 1 беÑÐµÐ·Ð½Ñ 2016
Ð¦Ñ Ð¾ÑобливÑÑÑÑ ÑаÑÑо викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ñи пÑÑÐ»Ñ Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ пÑомÑÐ¶ÐºÑ ÑаÑÑ. ÐапÑиклад, оÑÑимаймо даÑÑ â70 ÑекÑнд пÑÑÐ»Ñ Ð·Ð°Ñазâ:
let date = new Date();
date.setSeconds(date.getSeconds() + 70);
alert( date ); // показÑÑ Ð¿ÑавилÑÐ½Ñ Ð´Ð°ÑÑ
Ðи Ñакож можемо вÑÑановиÑи нÑÐ»Ñ Ð°Ð±Ð¾ навÑÑÑ Ð½ÐµÐ³Ð°ÑÐ¸Ð²Ð½Ñ Ð·Ð½Ð°ÑеннÑ. ÐапÑиклад:
let date = new Date(2016, 0, 2); // 2 ÑÑÑÐ½Ñ 2016
date.setDate(1); // вÑÑановиÑи 1 Ð´ÐµÐ½Ñ Ð¼ÑÑÑÑÑ
alert( date );
date.setDate(0); // мÑнÑмалÑний Ð½Ð¾Ð¼ÐµÑ Ð´Ð½Ñ -- 1, ÑÐ¾Ð¼Ñ Ð¿ÐµÑедбаÑаÑÑÑÑÑ, Ñо Ñе оÑÑаннÑй Ð´ÐµÐ½Ñ Ð¿Ð¾Ð¿ÐµÑеднÑого мÑÑÑÑÑ
alert( date ); // 31 гÑÑÐ´Ð½Ñ 2015
ÐеÑеÑвоÑÐµÐ½Ð½Ñ Ð´Ð°Ñи до ÑиÑла, ÑÑзниÑÑ Ð´Ð°Ñ
Ðоли Date обâÑÐºÑ Ð¿ÐµÑеÑвоÑÑÑÑÑÑÑ Ð½Ð° номеÑ, вÑн ÑÑÐ°Ñ timestamp Ñак Ñамо, Ñк date.getTime():
let date = new Date();
alert(+date); // кÑлÑкÑÑÑÑ Ð¼ÑлÑÑекÑнд, Ñак Ñамо, Ñк date.getTime()
Ðажливий побÑÑний еÑекÑ: даÑи можÑÑÑ Ð²ÑднÑмаÑиÑÑ, ÑезÑлÑÑаÑом Ñ ÑÑ ÑÑзниÑÑ Ð² мÑлÑÑекÑÐ½Ð´Ð°Ñ .
Це можна викоÑиÑÑовÑваÑи Ð´Ð»Ñ Ð²Ð¸Ð¼ÑÑÑÐ²Ð°Ð½Ð½Ñ ÑаÑÑ:
let start = new Date(); // поÑаÑок вимÑÑÑÐ²Ð°Ð½Ð½Ñ ÑаÑÑ
// виконÑÑÑÑÑÑ ÑобоÑа
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = new Date(); // кÑнеÑÑ Ð²Ð¸Ð¼ÑÑÑÐ²Ð°Ð½Ð½Ñ ÑаÑÑ
alert( `Цикл зайнÑв ${end - start} мÑ` );
Date.now()
ЯкÑо ми Ñ
оÑемо ÑÑлÑки вимÑÑÑÑи ÑаÑ, нам не поÑÑÑбен обâÑÐºÑ Date.
ÐÑнÑÑ ÑпеÑÑалÑний меÑод Date.now(), Ñо повеÑÑÐ°Ñ Ð¿Ð¾ÑоÑний timestamp.
Це ÑеманÑиÑно еквÑваленÑно до new Date().getTime(), але не ÑÑвоÑÑÑ Ð¿ÑомÑжного обâÑкÑа Date. Так Ñо Ñей пÑдÑ
Ñд пÑаÑÑÑ ÑвидÑе Ñ Ð½Ðµ наванÑажÑÑ Ð·Ð±Ð¸ÑÐ°Ñ ÑмÑÑÑÑ.
ÐÑн викоÑиÑÑовÑÑÑÑÑÑ Ð² оÑÐ½Ð¾Ð²Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ Ð·ÑÑÑноÑÑÑ Ð°Ð±Ð¾ коли важлива пÑодÑкÑивнÑÑÑÑ, Ñк в ÑгÑÐ°Ñ Ð½Ð° JavaScript або ÑнÑÐ¸Ñ ÑпеÑÑалÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°ÑÑоÑÑÐ½ÐºÐ°Ñ .
ÐÑже, Ñе, мабÑÑÑ, кÑаÑе:
let start = Date.now(); // кÑлÑкÑÑÑÑ Ð¼ÑлÑÑекÑнд з 1 ÑÑÑÐ½Ñ 1970 ÑокÑ
// виконÑÑÑÑÑÑ ÑобоÑа
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = Date.now(); // гоÑово
alert( `Цикл зайнÑв ${end - start} мÑ` ); // вÑднÑмемо ÑиÑÑи, а не даÑи
ÐимÑÑÑÐ²Ð°Ð½Ð½Ñ ÑвидкодÑÑ (Benchmarking)
ЯкÑо ми Ñ Ð¾Ñемо доÑÑовÑÑний аналÑз ÑвидкодÑÑ ÑÑнкÑÑÑ, Ñо залежиÑÑ Ð²Ñд пÑоÑеÑоÑа, ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи обеÑежними.
ÐапÑиклад, давайÑе вимÑÑÑÑмо Ð´Ð²Ñ ÑÑнкÑÑÑ, ÑÐºÑ Ð¾Ð±ÑиÑлÑÑÑÑ ÑÑзниÑÑ Ð¼Ñж двома даÑами: Ñка з Ð½Ð¸Ñ ÑвидÑе?
Ð¢Ð°ÐºÑ Ð²Ð¸Ð¼ÑÑÑÐ²Ð°Ð½Ð½Ñ Ð¿ÑодÑкÑивноÑÑÑ ÑаÑÑо називаÑÑÑÑÑ âбенÑмаÑкамиâ.
// У Ð½Ð°Ñ Ñ date1 Ñ date2. Яка ÑÑнкÑÑÑ ÑвидÑе повеÑне ÑÑ
Ð½Ñ ÑÑзниÑÑ Ð² мÑ?
function diffSubtract(date1, date2) {
return date2 - date1;
}
// Ñи
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
Ð¦Ñ Ð´Ð²Ñ ÑÑнкÑÑÑ ÑоблÑÑÑ ÑÑ
Ð¾Ð¶Ñ ÑеÑÑ, але одна з ниÑ
викоÑиÑÑовÑÑ Ñвний date.getTime(), Ñоб оÑÑимаÑи даÑÑ Ð² мÑ, а ÑнÑа покладаÑÑÑÑÑ Ð½Ð° пеÑеÑвоÑÐµÐ½Ð½Ñ Ð´Ð°Ñи до ÑиÑла. ÐÑ
ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð²Ð¶Ð´Ð¸ однаковий.
ÐÑже, Ñка з ÑÐ¸Ñ ÑÑнкÑÑй ÑвидÑа?
ÐеÑÑа ÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо можна багаÑо ÑазÑв запÑÑÑиÑи ÑÑ Ð¿Ð¾ÑпÑÐ»Ñ Ñ Ð²Ð¸Ð¼ÑÑÑÑи ÑÑзниÑÑ ÑаÑÑ. ÐÐ»Ñ Ð½Ð°Ñого Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑÑнкÑÑÑ Ð´Ñже пÑоÑÑÑ, ÑÐ¾Ð¼Ñ Ð¼Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð·Ð°Ð¿ÑÑÑиÑи ÑÑ ÑонайменÑе 100000 ÑазÑв.
ÐимÑÑÑÑмо:
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: ' + bench(diffSubtract) + 'мÑ' );
alert( 'Ð§Ð°Ñ diffGetTime: ' + bench(diffGetTime) + 'мÑ' );
ÐÑе Ñак! ÐикоÑиÑÑÐ°Ð½Ð½Ñ getTime() набагаÑо ÑвидÑе! Це ÑомÑ, Ñо Ð½ÐµÐ¼Ð°Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ ÑипÑ, Ñе набагаÑо пÑоÑÑÑÑе Ð´Ð»Ñ Ð¾Ð¿ÑимÑзаÑÑÑ.
ÐаÑазд, Ñ Ð½Ð°Ñ Ñ ÑоÑÑ. Ðле Ñе Ñе не Ñ Ð¾ÑоÑий бенÑмаÑк.
УÑвÑÑÑ ÑобÑ, Ñо пÑд ÑÐ°Ñ Ð·Ð°Ð¿ÑÑÐºÑ bench(diffSubtract) пÑоÑеÑÐ¾Ñ Ñобив ÑоÑÑ Ð¿Ð°ÑалелÑно, Ñ Ñе забиÑало Ð¿ÐµÐ²Ð½Ñ ÑеÑÑÑÑи. Рдо ÑаÑÑ ÑобоÑи bench(diffGetTime) ÑÑ ÑобоÑа закÑнÑилаÑÑ.
ÐоÑиÑÑ ÑеалÑний ÑÑенаÑÑй Ð´Ð»Ñ ÑÑÑаÑÐ½Ð¾Ñ Ð±Ð°Ð³Ð°ÑопÑоÑеÑоÑÐ½Ð¾Ñ ÐС.
Як ÑезÑлÑÑаÑ, пеÑÑий бенÑмаÑк бÑде маÑи менÑе ÑеÑÑÑÑÑв пÑоÑеÑоÑа, нÑж дÑÑгий. Це може пÑизвеÑÑи до непÑавилÑÐ½Ð¸Ñ ÑезÑлÑÑаÑÑв.
ÐÐ»Ñ Ð±ÑлÑÑ Ð´Ð¾ÑÑовÑÑного поÑÑвнÑлÑного аналÑзÑ, веÑÑ Ð¿Ð°ÐºÐµÑ Ð±ÐµÐ½ÑмаÑкÑв повинен бÑÑи повÑоÑно запÑÑений кÑлÑка ÑазÑв.
ÐапÑиклад, Ñк Ñе:
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(diffSubtract) Ñ bench(diffGetTime) кожен по 10 ÑазÑв
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
alert( 'ÐагалÑний ÑÐ°Ñ Ð´Ð»Ñ diffSubtract: ' + time1 );
alert( 'ÐагалÑний ÑÐ°Ñ Ð´Ð»Ñ diffGetTime: ' + time2 );
СÑÑаÑÐ½Ñ ÑÑÑÑÑ JavaScript поÑинаÑÑÑ Ð·Ð°ÑÑоÑовÑваÑи пеÑÐµÐ´Ð¾Ð²Ñ Ð¾Ð¿ÑимÑзаÑÑÑ Ð»Ð¸Ñе до âгаÑÑÑого кодÑâ, Ñкий виконÑÑ Ð±Ð°Ð³Ð°Ñо ÑазÑв (не поÑÑÑбно опÑимÑзÑваÑи ÑÑдко Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ñ ÑеÑÑ). ÐÑже, Ñ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼Ñ Ð²Ð¸Ñе пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð¿ÐµÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð½Ðµ опÑимÑзованÑ. Ðи можемо Ð·Ð°Ñ Ð¾ÑÑÑи додаÑи âнагÑÑваннÑâ:
// додано Ð´Ð»Ñ "нагÑÑваннÑ" до оÑновного ÑиклÑ
bench(diffSubtract);
bench(diffGetTime);
// ÑÐµÐ¿ÐµÑ Ð±ÐµÐ½ÑмаÑк
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
СÑÑаÑÐ½Ñ ÑÑÑÑÑ JavaScript заÑÑоÑовÑÑÑÑ Ð±Ð°Ð³Ð°Ñо опÑимÑзаÑÑй. Ðони можÑÑÑ Ð¿ÑдналаÑÑÑваÑи ÑезÑлÑÑаÑи âÑÑÑÑÐ½Ð¸Ñ ÑеÑÑÑвâ Ñ Ð¿Ð¾ÑÑвнÑÐ½Ð½Ñ Ð· âноÑмалÑним викоÑиÑÑаннÑмâ, оÑобливо коли ми ÑеÑÑÑÑмо ÑоÑÑ Ð´Ñже мале, напÑиклад, Ñк пÑаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑ, або вбÑдована ÑÑнкÑÑÑ. ÐÑже, ÑкÑо ви ÑеÑйозно Ñ Ð¾ÑеÑе оÑÑниÑи пÑодÑкÑивнÑÑÑÑ, Ñо, бÑÐ´Ñ Ð»Ð°Ñка, доÑлÑдÑÑÑ, Ñк пÑаÑÑÑ ÑÑÑÑй JavaScript. Ð ÑÐ¾Ð´Ñ Ð²Ð¸, мабÑÑÑ, не поÑÑебÑÑÑе мÑкÑобенÑмаÑкÑнгÑв взагалÑ.
Ðеликий набÑÑ ÑÑаÑей пÑо V8 можна знайÑи на https://mrale.ph.
Date.parse з ÑÑдка
ÐеÑод Date.parse(str) може ÑиÑаÑи даÑÑ Ð· ÑÑдка.
ФоÑÐ¼Ð°Ñ ÑÑдка повинен бÑÑи: YYYY-MM-DDTHH:mm:ss.sssZ, де:
YYYY-MM-DDâ Ñе даÑа: ÑÑк-мÑÑÑÑÑ-денÑ.- Символ
"T"викоÑиÑÑовÑÑÑÑÑÑ Ñк ÑоздÑлÑник. HH:mm:ss.sssâ Ñе ÑаÑ: години, Ñ Ð²Ð¸Ð»Ð¸Ð½Ð¸, ÑекÑнди Ñ Ð¼ÑлÑÑекÑнди.- ÐеобовâÑзкова ÑаÑÑина
'Z'познаÑÐ°Ñ ÑаÑовий поÑÑ Ñ ÑоÑмаÑÑ+-hh:mm. ÐдиниÑна бÑкваZбÑде ознаÑаÑи UTC+0.
ÐоÑоÑÑÑ Ð²Ð°ÑÑанÑи Ñакож можливÑ, Ñк YYYY-MM-DD або YYYY-MM або навÑÑÑ YYYY.
Ðиклик Date.parse(str) аналÑзÑÑ ÑÑдок Ñ Ð·Ð°Ð´Ð°Ð½Ð¾Ð¼Ñ ÑоÑмаÑÑ Ñа повеÑÑÐ°Ñ timestamp (кÑлÑкÑÑÑÑ Ð¼ÑлÑÑекÑнд з 1 ÑÑÑÐ½Ñ 1970 UTC+0). ЯкÑо ÑоÑÐ¼Ð°Ñ Ð½ÐµÐ´ÑйÑний, повеÑÑÐ°Ñ NaN.
ÐапÑиклад:
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (timestamp)
Ðи можемо миÑÑÑво ÑÑвоÑиÑи обâÑÐºÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ new Date з timestamp:
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );
alert(date);
ÐÑдÑÑмки
- ÐаÑа Ñа ÑÐ°Ñ Ñ JavaScript пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¾Ð±âÑкÑом Date. Ðи не можемо ÑÑвоÑиÑи âÑÑлÑки даÑÑâ або âÑÑлÑки ÑаÑâ: обâÑкÑи
Dateзавжди неÑÑÑÑ Ð² ÑÐ¾Ð±Ñ Ð¾Ð±Ð¸Ð´Ð²Ð° знаÑеннÑ. - ÐÑÑÑÑÑ ÑÐ°Ñ ÑÑÑÑÑÑ Ð· нÑÐ»Ñ (Ñак, ÑÑÑÐµÐ½Ñ â Ñе нÑлÑовий мÑÑÑÑÑ).
- ÐÐ½Ñ ÑÐ¸Ð¶Ð½Ñ Ð²
getDay()Ñакож ÑÐ°Ñ ÑÑÑÑÑÑ Ð· нÑÐ»Ñ (з недÑлÑ). DateавÑомаÑиÑно випÑавлÑÑ Ñебе, коли вÑÑановлено компоненÑи, ÑÐºÑ Ð²Ð¸Ñ Ð¾Ð´ÑÑÑ Ð·Ð° межÑ. Це добÑе Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ/вÑднÑÐ¼Ð°Ð½Ð½Ñ Ð´Ð½Ñв/мÑÑÑÑÑв/годин.- ÐаÑи можÑÑÑ Ð²ÑднÑмаÑиÑÑ, даÑÑи ÑÑ
Ð½Ñ ÑÑзниÑÑ Ð² мÑлÑÑекÑндаÑ
. Це ÑомÑ, Ñо
DateÑÑÐ°Ñ timestamp, коли пеÑеÑвоÑÑÑÑÑÑÑ Ð½Ð° ÑиÑло. - ÐикоÑиÑÑовÑйÑе
Date.now(), Ñоб Ñвидко оÑÑимаÑи поÑоÑний timestamp.
ÐаÑважÑе, Ñо на вÑдмÑÐ½Ñ Ð²Ñд багаÑÑÐ¾Ñ ÑнÑÐ¸Ñ ÑиÑÑем, знаÑÐµÐ½Ð½Ð¸Ñ timestamp в JavaScript вимÑÑÑÑÑÑÑÑ Ð² мÑлÑÑекÑÐ½Ð´Ð°Ñ , а не в ÑекÑÐ½Ð´Ð°Ñ .
ÐÐ½Ð¾Ð´Ñ Ð½Ð°Ð¼ поÑÑÑбно бÑлÑÑ ÑоÑÐ½Ñ Ð²Ð¸Ð¼ÑÑÑÐ²Ð°Ð½Ð½Ñ ÑаÑÑ. Сам JavaScript не Ð¼Ð°Ñ ÑпоÑÐ¾Ð±Ñ Ð²Ð¸Ð¼ÑÑÑÐ²Ð°Ð½Ð½Ñ ÑаÑÑ Ð² мÑкÑоÑекÑÐ½Ð´Ð°Ñ (1 мÑлÑйон Ñ ÑекÑндÑ), але бÑлÑÑÑÑÑÑ ÑеÑÐµÐ´Ð¾Ð²Ð¸Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑÑÑÑÑ Ð¹Ð¾Ð³Ð¾. ÐапÑиклад, бÑаÑÐ·ÐµÑ Ð¼Ð°Ñ performance.now(), Ñо Ð´Ð°Ñ ÐºÑлÑкÑÑÑÑ Ð¼ÑлÑÑекÑнд з поÑаÑÐºÑ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑÑоÑÑнки з мÑкÑоÑекÑÐ½Ð´Ð½Ð¾Ñ ÑоÑнÑÑÑÑ (3 ÑиÑÑи пÑÑÐ»Ñ ÐºÑапки):
alert(`ÐаванÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ÑалоÑÑ ${performance.now()}Ð¼Ñ ÑомÑ`);
// ЩоÑÑ Ð½Ð° зÑазок: "ÐаванÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ÑалоÑÑ 34731.26000000001Ð¼Ñ ÑомÑ"
// .26 Ñе мÑкÑоÑекÑнди (260 мÑкÑоÑекÑнд)
// коÑекÑними Ñ ÑÑлÑки пеÑÑÑ ÑÑи ÑиÑÑи пÑÑÐ»Ñ ÐºÑапки, а ÑеÑÑа -- Ñе помилка ÑоÑноÑÑÑ
Node.js Ð¼Ð°Ñ Ð¼Ð¾Ð´ÑÐ»Ñ microtime Ñа ÑнÑÑ ÑпоÑоби. ТеÑ
нÑÑно, майже бÑдÑ-Ñкий пÑиÑÑÑÑй Ñа ÑеÑедовиÑе дозволÑÑ Ð¾ÑÑимаÑи бÑлÑÑÑ ÑоÑнÑÑÑÑ, пÑоÑÑо ÑÑ Ð½ÐµÐ¼Ð°Ñ Ð² Date.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)