Loading...

дата жана убакыт

дата жана убакыт

 

Жаңы орнотулган объект менен таанышыңыз: Date . Ал дата менен убакытты камтыйт жана аларды манипуляциялоо ыкмаларын камтыйт.

Мисалы, аны түзүү/өзгөртүү убакыттарын сактоо, убакытты өлчөө же жөн гана учурдагы датаны көрсөтүү үчүн колдонсо болот.

Жаратуу

Жаңы объект түзүү үчүн конструкторду төмөнкү аргументтердин бири менен Dateчакырышыңыз керек :new Date()

new Date()

DateАргументтер жок - учурдагы датасы жана убактысы менен объект түзүңүз :

 
 
@A@let now = new Date();
alert( now ); // показывает текущие дату и время

new Date(milliseconds)@A@

Date1970-жылдын 1-январынан баштап миллисекунддордун санына (секунддун миңден бири) барабар убакыт менен объект түзүңүз UTC+0.

@A@// 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 );@A@

1970-жылдын башынан бери өткөн миллисекунддардын санын билдирген бүтүн сан убакыт белгиси деп аталат .

Бул датанын жеңил сандык көрүнүшү. Методдун жардамы менен сиз ар дайым убакыт белгисинен күндү алып new Date(timestamp), учурдагы объектти Dateубакыт белгисине айландырсаңыз болот date.getTime()(төмөндө караңыз).

1970-жылдын 1-январына чейинки даталарда терс убакыт белгилери болот, мисалы:

 
 
@A@// 31 декабря 1969 года
let Dec31_1969 = new Date(-24 * 3600 * 1000);
alert( Dec31_1969 );

new Date(datestring)@A@

Эгерде бир гана аргумент болсо жана бул сап болсо, анда дата андан "окулат". Талдоо алгоритми, Date.parseбиз кийинчерээк карап чыгабыз.

 
 
@A@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)@A@

DateЖергиликтүү убакыт алкагында берилген компоненттер менен объект түзүңүз . Биринчи эки гана аргумент талап кылынат.

  • yearтөрт сан болушу керек. Шайкештик үчүн 2 цифра да кабыл алынат жана катары каралат 19xx, мисалы, 98бул жерде ал менен бирдей 1998, бирок ар дайым 4 санды колдонуу сунушталат.
  • month0(январь) дан 11(декабрга чейин) башталат .
  • Бул жерде параметр dateайдын күнү болуп саналат. Эгер параметр коюлбаса, анда маани алынат 1.
  • hours/minutes/seconds/msПараметрлер жок болсо, алардын мааниси болот 0.

Мисалы:

@A@new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 Jan 2011, 00:00:00
new Date(2011, 0, 1); // то же самое, так как часы и проч. равны 0@A@

Максималдуу тактык - 1 мс (1/1000 секундга чейин):

 
 
@A@let date = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( date ); // 1.01.2011, 02:03:04.567@A@

Дата компоненттерин алуу

Жылды, айды ж.б. алуунун ыкмалары бар. объекттен Date:

getFullYear()

Жылды алуу (4 сан)

getMonth()

Айды 0дөн 11ге чейин алыңыз .

getDate()

Айдын күнүн 1ден 31ге чейин алыңыз, бул ыкманын аталышына бир аз карама-каршы келет.

getHours() , getMinutes() , getSeconds() , getMilliseconds()

Алып, тиешелүүлүгүнө жараша, саат, мүнөт, секунд же миллисекунд.

Жок getYear(). ганаgetFullYear()

Көптөгөн JavaScript котормочулары стандарттуу эмес жана эскирген ыкманы ишке ашырышат getYear(), ал кээде жылды эки сан катары кайтарат. Сураныч, андан качыңыз. Эгер сизге бир жылдык маани керек болсо, колдонуңуз getFullYear().

Мындан тышкары, сиз жуманын белгилүү бир күнүн ала аласыз:

getDay()

Аптанын күнүн 0(жекшембиден) 6(ишембиге) кайтарыңыз. Кээ бир өлкөлөрдө жуманын биринчи күнү дүйшөмбү болгонуна карабастан, JavaScript-те жуманын башы жекшембиге туура келет.

Жогорудагы ыкмалардын бардыгы жергиликтүү убакыт алкагына ылайык маанилерди кайтарат.

Бирок, алардын UTC+0 убакыт алкагы үчүн күндү, айды, жылды кайтарган UTC варианттары да бар: getUTCFullYear() , getUTCMonth() , getUTCDay() . "get"Аларды колдонуу үчүн, кийин алмаштыруу керек "UTC".

Эгер сиздин жергиликтүү убакыт алкагыңыз UTC менен алмаштырылса, анда төмөнкү код башка сааттарды көрсөтөт:

 
 
@A@// текущая дата
let date = new Date();

// час в вашем текущем часовом поясе
alert( date.getHours() );

// час в часовом поясе UTC+0 (лондонское время без перехода на летнее время)
alert( date.getUTCHours() );@A@

Жогорудагы ыкмалардан тышкары, UTC жок эки атайын ыкма бар:

getTime()

Берилген дата үчүн убакыт белгисин кайтарат - 1970-жылдын 1-январынан берки миллисекунддардын саны UTC+0.

getTimezoneOffset()

UTC менен жергиликтүү убакыт алкагынын ортосундагы мүнөттөрдөгү айырманы кайтарат:

@A@// если вы в часовом поясе UTC-1, то выводится 60
// если вы в часовом поясе UTC+3, выводится -180
alert( new Date().getTimezoneOffset() );@A@

Дата компоненттерин орнотуу

Төмөнкү ыкмалар дата жана убакыт компоненттерин коюуга мүмкүндүк берет:

Бул ыкмалардын бардыгынан башкасынын setTime()UTC варианты бар, мисалы: setUTCHours().

Көрүнүп тургандай, кээ бир ыкмалар бир эле учурда бир нече дата компоненттерин орното алат, мисалы: setHours. Эгерде кандайдыр бир компонент көрсөтүлбөсө, ал өзгөрбөйт.

Мисал:

@A@let today = new Date();

today.setHours(0);
alert(today); // выводится сегодняшняя дата, но значение часа будет 0

today.setHours(0, 0, 0, 0);
alert(today); // всё ещё выводится сегодняшняя дата, но время будет ровно 00:00:00.@A@

Автотүздөө күнү

Автокоррекциянын абдан пайдалуу өзгөчөлүгү Date. Сиз дата компоненттерин нормалдуу маанилердин диапазонунан тышкары орното аласыз жана объект өзүн өзү оңдойт.

Мисал:

@A@let date = new Date(2013, 0, 32); // 32 Jan 2013 ?!?
alert(date); // ...1st Feb 2013!@A@

Туура эмес дата компоненттери калгандарына автоматтык түрдө бөлүштүрүлөт.

«2016-жылдын 28-февралы» деген датаны эки күнгө көбөйтүү керек дейли. Кабира жылбы, жокпу, ошого жараша «2-март» же «1-март» болот. Бул жөнүндө ойлонуунун кереги жок. Эки күн кошуңуз. Калганын объект Dateчечет:

@A@let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);
alert( date ); // 1 Mar 2016@A@

Бул өзгөчөлүк көп учурда белгилүү бир убакыт өткөндөн кийин датаны алуу үчүн колдонулат. Мисалы, "70 секунддан кийин" датаны алалы:

 
 
@A@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@A@

Санга, күн айырмасына айландыруу

Эгерде объект Dateсанга айландырылса, анда биз төмөнкүгө окшош убакыт белгисин алабыз date.getTime():

let date = new Date();
alert(+date); // количество миллисекунд, то же самое, что date.getTime()@A@

Маанилүү терс таасир: даталарды алып салууга болот, натыйжада миллисекунддор менен айырмачылык пайда болот.

Бул ыкма убакытты өлчөө үчүн колдонулушу мүмкүн:

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 же башка атайын тиркемелерде оюндарды иштеп чыгууда колдонулат.

Мурунку мисалды төмөнкүдөй кайра жазганыңыз жакшы:

@A@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} миллисекунд` ); // вычитаются числа, а не даты@A@

Бенчмаркинг

Процессорго көз каранды болгон функциянын иштешин так сынагыңыз келсе, сак болуңуз.

Мисалы, эки күндүн ортосундагы айырманы эсептеген эки функцияны салыштырып көрөлү: кайсынысы тезирээк иштейт?

Натыйжалуулукту өлчөөчү мындай эсептөөлөр "эталондор" (бенчмарк) деп да аталат.

@A@// есть date1 и date2, какая функция быстрее вернёт разницу между ними в миллисекундах?
function diffSubtract(date1, date2) {
  return date2 - date1;
}

// или
function diffGetTime(date1, date2) {
  return date2.getTime() - date1.getTime();
}@A@

Эки функция тең бир эле нерсени аткарат, бирөө гана күндү миллисекундда алуу үчүн ачык ыкманы колдонот date.getTime(), ал эми экинчиси датаны санга айландырууга таянат. Алардын ишинин натыйжасы дайыма бирдей.

Бирок кайсы функция тезирээк?

Баштоочулар үчүн, сиз аларды катары менен көп жолу иштетип, айырманы байкай аласыз. Биздин учурда, функциялар абдан жөнөкөй, ошондуктан, жок эле дегенде, 100 000 кайталоо талап кылынат.

Келгиле, өлчөөлөрдү алалы:

@A@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)ал аны эчак эле бүтүргөн.

Заманбап мультипроцессордук операциялык системалардагы кыйла реалдуу сценарий.

Натыйжада, биринчи эталондун экинчисине караганда процессор ресурстары азыраак болот. Бул натыйжаларды бурмалап коюшу мүмкүн.

Эң ишенимдүү аткаруу тестинин натыйжаларын алуу үчүн, бардык эталондорду бир нече жолу иштетүү керек.

Мисалы, бул сыяктуу:

@A@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 );@A@

Заманбап JavaScript котормочулары өркүндөтүлгөн оптималдаштырууларды бир нече жолу иштеген “ысык кодго” гана колдоно башташат (сейрек иштей турган нерсени оптималдаштыруунун кереги жок). Ошентип, жогорудагы мисалда, биринчи чуркоо туура оптималдаштырылган эмес. "Жылытуу" үчүн алдын ала ишке киргизүү пайдалуу болмок:

@A@// добавляем для "разогрева" перед основным циклом
bench(diffSubtract);
bench(diffGetTime);

// а теперь тестируем производительность
for (let i = 0; i < 10; i++) {
  time1 += bench(diffSubtract);
  time2 += bench(diffGetTime);
}@A@
Микробаяндар менен этият болуңуз

Заманбап 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)берилген форматта сапты иштетип, убакыт белгисин кайтарат (1970-жылдын 1-январынан бери миллисекунддордун саны UTC+0). Эгерде формат жараксыз болсо, кайтарат NaN.

Мисалы:

 
 
@A@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);@A@

Бардыгы

  • JavaScript'те дата жана убакыт Date объекти менен көрсөтүлөт . Сиз "бир гана күн" же "убакыт гана" түзө албайсыз: объекттер Dateар дайым экөөнү тең камтыйт.
  • Айлар нөлдөн баштап эсептелет (ооба, январь нөлдүк ай).
  • Аптанын күндөрү getDay()да нөлдөн баштап эсептелет, бул жекшембиге туура келет.
  • Объект Dateдиапазондон тышкаркы маанилерди киргизүүдө өзүн өзү оңдойт. Бул күндөрдү/айларды/жумаларды кошуу/кемитүү үчүн пайдалуу.
  • Даталарды алып салууга болот жана айырма миллисекунд менен кайтарылат. Себеби санга айландырылганда объект Dateубакыт белгисине айланат.
  • Date.now()Учурдагы убакытты убакыт белгиси форматында тез алуу үчүн колдонуңуз .

Кээ бир башка системалардан айырмаланып, JavaScript убакыт белгилери секундада эмес, миллисекундда экенин эске алыңыз.

Кээде биз убакытты көбүрөөк тактык менен өлчөөбүз керек. Сиз JavaScript'те убакытты микросекунддар менен (секунддун миллиондон бир бөлүгү) өлчөй албайсыз, бирок көпчүлүк чөйрөлөр өлчөйт. Мисалы, браузерлерде барак жүктөлө баштагандан берки миллисекунддордун санын кайтарып берүүчү performans.now() ыкмасы бар, микросекундга чейин так (чекиттен кийин 3 цифра):

 
 
@A@alert(`Загрузка началась ${performance.now()}мс назад`);
// Получаем что-то вроде: "Загрузка началась 34731.26000000001мс назад"
// .26 –- это микросекунды (260 микросекунд)
// корректными являются только первые три цифры после точки, а остальные -- это ошибка точности@A@

Node.js бул үчүн модулду microtimeжана бир катар башка жолдор менен камсыз кылат. Техникалык жактан алганда, дээрлик бардык түзмөк же чөйрө көбүрөөк тактыкка жетүүгө мүмкүндүк берет, бул жөн гана объектте эмес Date.

Tasks

маанилүүлүгү: 5

DateДатага объект түзүү : 2012-жылдын 20-февралы, 3 саат 12 мүнөт. Убакыт алкагы жергиликтүү.

чыгаруу үчүн, колдонуңуз alert.

чечим
маанилүүлүгү: 5

getWeekDay(date)Аптанын күнүн кыска форматта көрсөткөн функцияны жазыңыз: "Дш", "Шей", "Шар", "Бейшемби", "Жум", "Шб", "Күн" .

Мисалы:

@A@let date = new Date(2012, 0, 3);  // 3 января 2012 года
alert( getWeekDay(date) );        // нужно вывести "ВТ"@A@

Тапшырма үчүн тесттер менен кумкоргонду ачыңыз.

чечим
маанилүүлүгү: 5

Европа өлкөлөрүндө жума дүйшөмбүдөн башталат (1-күн), андан кийин шейшемби (2-сан) келет жана жекшембиге чейин (7-сан) уланат. getLocalDay(date)Күн үчүн жуманын "европалык" күнүн кайтарган функцияны жазыңыз date.

@A@let date = new Date(2012, 0, 3);  // 3 января 2012 года
alert( getLocalDay(date) );       // вторник, нужно показать 2@A@

Тапшырма үчүн тесттер менен кумкоргонду ачыңыз.

чечим
маанилүүлүгү: 4

Датадан баштап күндөрдүн getDateAgo(date, days)санын кайтарган функция түзүңүз .daysdate

Мисалы, бүгүн жыйырманчы болсо, анда он тогузунчу жана он сегизинчисин getDateAgo(new Date(), 1)кайтарат .getDateAgo(new Date(), 2)

Функция баалуу days=365жана чоң маанилер үчүн ишенимдүү иштеши керек:

@A@let date = new Date(2015, 0, 2);

alert( getDateAgo(date, 1) ); // 1, (1 Jan 2015)
alert( getDateAgo(date, 2) ); // 31, (31 Dec 2014)
alert( getDateAgo(date, 365) ); // 2, (2 Jan 2014)@A@

PS Функция ага берилген объектти өзгөртпөшү керек date.

Тапшырма үчүн тесттер менен кумкоргонду ачыңыз.

чечим
маанилүүлүгү: 5

getLastDayOfMonth(year, month)Айдын акыркы күнүн кайтарган функцияны жазыңыз . Кээде 30, 31 же 28/29-февраль.

Параметрлер:

  • year– төрт орундуу жыл, мисалы, 2012-жыл.
  • month– ай 0дөн 11ге чейин.

Мисалы, getLastDayOfMonth(2012, 1) = 29(кибирек жыл, февраль).

Тапшырма үчүн тесттер менен кумкоргонду ачыңыз.

чечим
маанилүүлүгү: 5

getSecondsToday()Бүгүнкү күндөн баштап секунданын санын кайтаруучу функцияны жазыңыз .

Мисалы, эгерде азыр 10:00, жана кышкы/жайкы убакытка өтүү жок болсо, анда:

getSecondsToday() == 36000 // (3600 * 10)

Функция каалаган күнү иштеши керек, б.а. ал бүгүнкү күн үчүн белгилүү бир мааниге ээ болбошу керек.

чечим
маанилүүлүгү: 5

getSecondsToTomorrow()Эртеңки күнгө чейин секунданын санын кайтарган функцияны түзүңүз .

Мисалы, азыр болсо 23:00, анда:

getSecondsToTomorrow() == 3600

PS Функция каалаган күнү иштеши керек, б.а. ал бүгүнкү күн үчүн белгилүү бир мааниге ээ болбошу керек.

чечим
маанилүүлүгү: 4

Мындай formatDate(date)форматталуучу функцияны жазыңыз :date

  • date1 секунддан аз убакыт өтсө, чыгарыңыз "прямо сейчас".
  • Болбосо, dateандан бери 1 мүнөттөн аз убакыт өтсө, чыгаруу "n сек. назад".
  • Болбосо, бир сааттан аз болсо, чыгаруу "m мин. назад".
  • Болбосо, толук күн "DD.MM.YY HH:mm". Тактап айтканда: "день.месяц.год часы:минуты", бардыгы эки цифра түрүндө, б.а. 31.12.16 10:00.

Мисалы:

@A@alert( formatDate(new Date(new Date - 1)) ); // "прямо сейчас"

alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 сек. назад"

alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 мин. назад"

// вчерашняя дата вроде 31.12.2016, 20:00
alert( formatDate(new Date(new Date - 86400 * 1000)) );@A@