ÐÑÑÑеÑайÑе новÑй вÑÑÑоеннÑй обÑекÑ: Date. Ðн ÑодеÑÐ¶Ð¸Ñ Ð´Ð°ÑÑ Ð¸ вÑемÑ, а Ñакже пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼Ð¸.
ÐапÑимеÑ, его можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²Ñемени ÑозданиÑ/изменениÑ, Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ Ð²Ñемени или пÑоÑÑо Ð´Ð»Ñ Ð²Ñвода ÑекÑÑей даÑÑ.
Создание
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа Date нÑжно вÑзваÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ new Date() Ñ Ð¾Ð´Ð½Ð¸Ð¼ из ÑледÑÑÑиÑ
аÑгÑменÑов:
new Date()-
Ðез аÑгÑменÑов â ÑоздаÑÑ Ð¾Ð±ÑекÑ
DateÑ ÑекÑÑими даÑой и вÑеменем:let now = new Date(); alert( now ); // показÑÐ²Ð°ÐµÑ ÑекÑÑие даÑÑ Ð¸ вÑÐµÐ¼Ñ new Date(milliseconds)-
СоздаÑÑ Ð¾Ð±ÑекÑ
DateÑ Ð²Ñеменем, ÑавнÑм колиÑеÑÑÐ²Ñ Ð¼Ð¸Ð»Ð»Ð¸ÑекÑнд (ÑÑÑÑÑÐ½Ð°Ñ Ð´Ð¾Ð»Ñ ÑекÑндÑ), пÑоÑедÑÐ¸Ñ Ñ 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).
ÐÑо â легковеÑное ÑиÑленное пÑедÑÑавление даÑÑ. Ðз ÑаймÑÑампа вÑегда можно полÑÑиÑÑ Ð´Ð°ÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
new Date(timestamp)и пÑеобÑазоваÑÑ ÑÑÑеÑÑвÑÑÑий обÑекÑDateв ÑаймÑÑамп, иÑполÑзÑÑ Ð¼ÐµÑодdate.getTime()(Ñм. ниже).ÐаÑам до 1 ÑнваÑÑ 1970 бÑдÑÑ ÑооÑвеÑÑÑвоваÑÑ Ð¾ÑÑиÑаÑелÑнÑе ÑаймÑÑампÑ, напÑимеÑ:
// 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); // ÐÑÐµÐ¼Ñ Ð½Ðµ Ñказано, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ ÑÑавиÑÑÑ Ð² полноÑÑ Ð¿Ð¾ ÐÑинвиÑÑ Ð¸ // менÑеÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ ÑаÑовÑм поÑÑом меÑÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° // Так ÑÑо в ÑезÑлÑÑаÑе можно полÑÑиÑÑ // Thu Jan 26 2017 11:00:00 GMT+1100 (воÑÑоÑно-авÑÑÑалийÑкое вÑемÑ) // или // Wed Jan 25 2017 16:00:00 GMT-0800 (ÑÐ¸Ñ Ð¾Ð¾ÐºÐµÐ°Ð½Ñкое вÑемÑ) new Date(year, month, date, hours, minutes, seconds, ms)-
СоздаÑÑ Ð¾Ð±ÑекÑ
DateÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñми компоненÑами в меÑÑном ÑаÑовом поÑÑе. ÐбÑзаÑелÑÐ½Ñ ÑолÑко пеÑвÑе два аÑгÑменÑа.yearдолжен ÑоÑÑоÑÑÑ Ð¸Ð· ÑеÑÑÑÑÑ ÑиÑÑ. ÐÐ»Ñ ÑовмеÑÑимоÑÑи Ñакже пÑинимаÑÑÑÑ 2 ÑиÑÑÑ Ð¸ ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº19xx, к пÑимеÑÑ,98здеÑÑ ÑÑо Ñоже Ñамое, ÑÑо и1998, но наÑÑоÑÑелÑно ÑекомендÑеÑÑÑ Ð²Ñегда иÑполÑзоваÑÑ 4 ÑиÑÑÑ.monthнаÑинаеÑÑÑ Ñ0(ÑнваÑÑ) по11(декабÑÑ).- ÐаÑамеÑÑ
dateздеÑÑ Ð¿ÑедÑÑавлÑÐµÑ Ñобой Ð´ÐµÐ½Ñ Ð¼ÐµÑÑÑа. ÐÑли паÑамеÑÑ Ð½Ðµ задан, Ñо пÑинимаеÑÑÑ Ð·Ð½Ð°Ñение1. - ÐÑли паÑамеÑÑÑ
hours/minutes/seconds/msоÑÑÑÑÑÑвÑÑÑ, Ð¸Ñ Ð·Ð½Ð°Ñением ÑÑановиÑÑÑ0.
ÐапÑимеÑ:
new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 Jan 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(), коÑоÑÑй поÑой возвÑаÑÐ°ÐµÑ Ð³Ð¾Ð´ в виде двÑÑ
ÑиÑÑ. ÐожалÑйÑÑа, обÑ
одиÑе его ÑÑоÑоной. ÐÑли нÑжно знаÑение года, иÑполÑзÑйÑе getFullYear().
ÐÑоме Ñого, можно полÑÑиÑÑ Ð¾Ð¿ÑеделÑннÑй Ð´ÐµÐ½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸:
- getDay()
- ÐеÑнÑÑÑ Ð´ÐµÐ½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸ оÑ
0(воÑкÑеÑенÑе) до6(ÑÑббоÑа). ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо в ÑÑде ÑÑÑан за пеÑвÑй Ð´ÐµÐ½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸ пÑинÑÑ Ð¿Ð¾Ð½ÐµÐ´ÐµÐ»Ñник, в JavaScript наÑало недели пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð½Ð° воÑкÑеÑенÑе.
ÐÑе вÑÑепеÑеÑиÑленнÑе меÑÐ¾Ð´Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑооÑвеÑÑÑвии Ñ Ð¼ÐµÑÑнÑм ÑаÑовÑм поÑÑом.
Ðднако ÑÑÑеÑÑвÑÑÑ Ð¸ иÑ
UTC-ваÑианÑÑ, возвÑаÑаÑÑие денÑ, меÑÑÑ, год Ð´Ð»Ñ Ð²Ñеменной Ð·Ð¾Ð½Ñ UTC+0: getUTCFullYear(), getUTCMonth(), getUTCDay(). ÐÐ»Ñ Ð¸Ñ
иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑебÑеÑÑÑ Ð¿Ð¾Ñле "get" подÑÑавиÑÑ "UTC".
ÐÑли Ð²Ð°Ñ Ð¼ÐµÑÑнÑй ÑаÑовой поÑÑ ÑмеÑÑн оÑноÑиÑелÑно UTC, Ñо ÑледÑÑÑий код Ð¿Ð¾ÐºÐ°Ð¶ÐµÑ ÑазнÑе ÑаÑÑ:
// ÑекÑÑÐ°Ñ Ð´Ð°Ñа
let date = new Date();
// ÑÐ°Ñ Ð² ваÑем ÑекÑÑем ÑаÑовом поÑÑе
alert( date.getHours() );
// ÑÐ°Ñ Ð² ÑаÑовом поÑÑе UTC+0 (лондонÑкое вÑÐµÐ¼Ñ Ð±ÐµÐ· пеÑеÑ
ода на леÑнее вÑемÑ)
alert( date.getUTCHours() );
Ðомимо вÑÑепÑиведÑннÑÑ Ð¼ÐµÑодов, ÑÑÑеÑÑвÑÑÑ Ð´Ð²Ð° оÑобÑÑ Ð¼ÐµÑода без UTC-ваÑианÑа:
- getTime()
-
ÐÐ»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ даÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑаймÑÑамп â колиÑеÑÑво миллиÑекÑнд, пÑоÑедÑÐ¸Ñ Ñ 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 Jan 2013 ?!?
alert(date); // ...1st Feb 2013!
ÐепÑавилÑнÑе компоненÑÑ Ð´Ð°ÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑаÑпÑеделÑÑÑÑÑ Ð¿Ð¾ оÑÑалÑнÑм.
ÐÑедположим, нам ÑÑебÑеÑÑÑ ÑвелиÑиÑÑ Ð´Ð°ÑÑ Â«28 ÑевÑÐ°Ð»Ñ 2016» на два днÑ. РзавиÑимоÑÑи Ð¾Ñ Ñого, виÑокоÑнÑй ÑÑо год или неÑ, ÑезÑлÑÑаÑом бÑÐ´ÐµÑ Â«2 маÑÑа» или «1 маÑÑа». Ðам об ÑÑом дÑмаÑÑ Ð½Ðµ нÑжно. ÐÑоÑÑо пÑибавлÑем два днÑ. ÐбÑÐµÐºÑ Date позабоÑиÑÑÑ Ð¾Ð± оÑÑалÑном:
let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);
alert( date ); // 1 Mar 2016
ÐÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑаÑÑо иÑполÑзÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð°ÑÑ Ð¿Ð¾ пÑоÑеÑÑвии заданного оÑÑезка вÑемени. ÐапÑимеÑ, полÑÑим даÑÑ Â«ÑпÑÑÑÑ 70 ÑекÑнд Ñ ÑекÑÑего моменÑа»:
let date = new Date();
date.setSeconds(date.getSeconds() + 70);
alert( date ); // вÑÐ²Ð¾Ð´Ð¸Ñ Ð¿ÑавилÑнÑÑ Ð´Ð°ÑÑ
Также можно ÑÑÑановиÑÑ Ð½ÑлевÑе или даже оÑÑиÑаÑелÑнÑе знаÑениÑ. ÐапÑимеÑ:
let date = new Date(2016, 0, 2); // 2 Jan 2016
date.setDate(1); // задаÑÑ Ð¿ÐµÑвое ÑиÑло меÑÑÑа
alert( date );
date.setDate(0); // пеÑвÑй Ð´ÐµÐ½Ñ Ð¼ÐµÑÑÑа -- ÑÑо 1, Ñак ÑÑо вÑводиÑÑÑ Ð¿Ð¾Ñледнее ÑиÑло пÑедÑдÑÑего меÑÑÑа
alert( date ); // 31 Dec 2015
ÐÑеобÑазование к ÑиÑлÑ, ÑазноÑÑÑ Ð´Ð°Ñ
ÐÑли обÑÐµÐºÑ Date пÑеобÑазоваÑÑ Ð² ÑиÑло, Ñо полÑÑим ÑаймÑÑамп по аналогии Ñ 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(), возвÑаÑаÑÑий ÑекÑÑÑÑ Ð¼ÐµÑÐºÑ Ð²Ñемени.
СеманÑиÑеÑки он ÑквиваленÑен 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} миллиÑекÑнд` ); // вÑÑиÑаÑÑÑÑ ÑиÑла, а не даÑÑ
ÐенÑмаÑкинг
ÐÑдÑÑе внимаÑелÑнÑ, еÑли Ñ Ð¾ÑиÑе ÑоÑно пÑоÑеÑÑиÑоваÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ ÑÑнкÑии, коÑоÑÐ°Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ Ð¿ÑоÑеÑÑоÑа.
ÐапÑимеÑ, ÑÑавним две ÑÑнкÑии, вÑÑиÑлÑÑÑие ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð´Ð°Ñами: ÐºÐ°ÐºÐ°Ñ ÑÑабоÑÐ°ÐµÑ Ð±ÑÑÑÑее?
ÐодобнÑе вÑÑиÑлениÑ, замеÑÑÑÑие пÑоизводиÑелÑноÑÑÑ, Ñакже назÑваÑÑ Â«Ð±ÐµÐ½ÑмаÑками» (benchmark).
// еÑÑÑ 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(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) обÑабаÑÑÐ²Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ Ð² заданном ÑоÑмаÑе и возвÑаÑÐ°ÐµÑ ÑаймÑÑамп (колиÑеÑÑво миллиÑекÑнд Ñ 1 ÑнваÑÑ 1970 года UTC+0). ÐÑли ÑоÑÐ¼Ð°Ñ Ð½ÐµÐ¿ÑавилÑнÑй, возвÑаÑаеÑÑÑ NaN.
ÐапÑимеÑ:
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (ÑаймÑÑамп)
Ðожно ÑÑÑ Ð¶Ðµ ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ new Date из ÑаймÑÑампа:
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );
alert(date);
ÐÑого
- ÐаÑа и вÑÐµÐ¼Ñ Ð² JavaScript пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¾Ð±ÑекÑом Date. ÐелÑÐ·Ñ ÑоздаÑÑ Â«ÑолÑко даÑÑ» или «ÑолÑко вÑемÑ»: обÑекÑÑ
DateвÑегда ÑодеÑÐ¶Ð°Ñ Ð¸ Ñо, и дÑÑгое. - СÑÑÑ Ð¼ÐµÑÑÑев наÑинаеÑÑÑ Ñ Ð½ÑÐ»Ñ (да, ÑнваÑÑ â ÑÑо нÑлевой меÑÑÑ).
- Ðни недели в
getDay()Ñакже оÑÑÑиÑÑваÑÑÑÑ Ñ Ð½ÑлÑ, ÑÑо ÑооÑвеÑÑÑвÑÐµÑ Ð²Ð¾ÑкÑеÑенÑÑ. - ÐбÑекÑ
DateÑамоÑÑоÑÑелÑно коÑÑекÑиÑÑеÑÑÑ Ð¿Ñи введении знаÑений, вÑÑ Ð¾Ð´ÑÑÐ¸Ñ Ð·Ð° Ñамки допÑÑÑимÑÑ . ÐÑо полезно Ð´Ð»Ñ ÑложениÑ/вÑÑиÑÐ°Ð½Ð¸Ñ Ð´Ð½ÐµÐ¹/меÑÑÑев/неделÑ. - ÐаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑÑиÑаÑÑ, иÑ
ÑазноÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð² миллиÑекÑндаÑ
. Так пÑоиÑÑ
одиÑ, поÑÐ¾Ð¼Ñ ÑÑо пÑи пÑеобÑазовании в ÑиÑло обÑекÑ
DateÑÑановиÑÑÑ ÑаймÑÑампом. - ÐÑполÑзÑйÑе
Date.now()Ð´Ð»Ñ Ð±ÑÑÑÑого полÑÑÐµÐ½Ð¸Ñ ÑекÑÑего вÑемени в ÑоÑмаÑе ÑаймÑÑампа.
УÑÑиÑе, ÑÑо, в оÑлиÑие Ð¾Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´ÑÑÐ³Ð¸Ñ ÑиÑÑем, в JavaScript ÑаймÑÑамп в миллиÑекÑÐ½Ð´Ð°Ñ , а не в ÑекÑÐ½Ð´Ð°Ñ .
ÐоÑой нам нÑжно измеÑиÑÑ Ð²ÑÐµÐ¼Ñ Ñ Ð±Ð¾Ð»ÑÑей ÑоÑноÑÑÑÑ. СобÑÑвеннÑми ÑÑедÑÑвами JavaScript измеÑÑÑÑ Ð²ÑÐµÐ¼Ñ Ð² микÑоÑекÑÐ½Ð´Ð°Ñ (одна Ð¼Ð¸Ð»Ð»Ð¸Ð¾Ð½Ð½Ð°Ñ ÑекÑндÑ) нелÑзÑ, но в болÑÑинÑÑве ÑÑед ÑÐ°ÐºÐ°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÐµÑÑÑ. РпÑимеÑÑ, в бÑаÑзеÑÐ°Ñ ÐµÑÑÑ Ð¼ÐµÑод performance.now(), возвÑаÑаÑÑий колиÑеÑÑво миллиÑекÑнд Ñ Ð½Ð°Ñала загÑÑзки ÑÑÑаниÑÑ Ñ ÑоÑноÑÑÑÑ Ð´Ð¾ микÑоÑекÑнд (3 ÑиÑÑÑ Ð¿Ð¾Ñле ÑоÑки):
alert(`ÐагÑÑзка наÑалаÑÑ ${performance.now()}Ð¼Ñ Ð½Ð°Ð·Ð°Ð´`);
// ÐолÑÑаем ÑÑо-Ñо вÑоде: "ÐагÑÑзка наÑалаÑÑ 34731.26000000001Ð¼Ñ Ð½Ð°Ð·Ð°Ð´"
// .26 â- ÑÑо микÑоÑекÑÐ½Ð´Ñ (260 микÑоÑекÑнд)
// коÑÑекÑнÑми ÑвлÑÑÑÑÑ ÑолÑко пеÑвÑе ÑÑи ÑиÑÑÑ Ð¿Ð¾Ñле ÑоÑки, а оÑÑалÑнÑе -- ÑÑо оÑибка ÑоÑноÑÑи
Ð Node.js Ð´Ð»Ñ ÑÑого пÑедÑÑмоÑÑен модÑÐ»Ñ microtime и ÑÑд дÑÑгиÑ
ÑпоÑобов. ТеÑ
ниÑеÑки поÑÑи лÑбое ÑÑÑÑойÑÑво или ÑÑеда позволÑÐµÑ Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð±Ð¾Ð»ÑÑей ÑоÑноÑÑи, пÑоÑÑо ÐµÑ Ð½ÐµÑ Ð² обÑекÑе Date.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)