Об'єкт Date: Поточна Дата та Час у Javascript
У цьому пості хочу торкнутися теми роботи з датами Javascript, яка, при першому наближенні, може здатися складною.
Для роботи з датами Javascript надає розробникам вбудований функціонал у вигляді об'єкта Date.
Примірник об'єкта Date - це момент часу. Методи об'єкта дозволяють керувати не тільки датами, але і часом.
Розглянемо 4 способи створити новий об'єкт Date.
1. Використовувати конструктор New Date() без передачі додаткових параметрів
Для створення нового об'єкта Date потрібно викликати конструктор:
1new
Date();
2
// Wed Sep 23 2020 12:59:15 GMT+0300 (Москва, стандартний час)
Це дозволить нам отримати новий екземпляр об'єкта Date, що містить поточний час.
Як нульовий (базовий) дати, Javascript використовує 1 Січня 1970 00:00:00 UTC . Поточний момент часу – кількість мілісекунд, що пройшли з нульової дати.
2. Використати конструктор new Date() з передачею тимчасової мітки, вираженої в мілісекундах
Ймовірно, ви стикалися з тимчасовою міткою Unix, яка використовує ту ж нульову дату, але представлена не в мілісекундах, А секундах.
Ми можемо передати тимчасову мітку Unix в об'єкт Date та отримати відповідний момент часу наступним чином:
1const
unixTimeStamp
=
1600855031;
2
new
Date(unixTimeStamp
*
1000);
3
// Wed Sep 23 2020 12:57:11 GMT+0300 (Москва, стандартний час)
Якщо ми передамо 0 в об'єкт Date, то отримаємо нульову дату 1 січня 1970.
1new
Date(0);
2
// Thu Jan 01 1970 03:00:00 GMT+0300 (Москва, стандартний час)
Можна також використовувати вбудований метод Date.now(), щоб отримати поточну тимчасову мітку в мілісекундах і передати її в об'єкт Date.
1Date.now();
2
// 1600855352116
3
new
Date(1600855352116);
4
// Wed Sep 23 2020 13:02:32 GMT+0300 (Москва, стандартний час)
3. Передати дату в об'єкт Date – у форматі рядка
Ми також можемо використовувати малі висловлювання для передачі в об'єкт Date та отримання відповідного моменту часу. У цьому випадку в об'єкті Date автоматично використовуватиметься метод parse для визначення дати і часу, які ми передаємо в нього.
1new
Date('2020-09-20');
2
// Sun Sep 20 2020 03:00:00 GMT+0300 (Москва, стандартний час)
3
4
new
Date('2020/09/20');
5
// Sun Sep 20 2020 00:00:00 GMT+0300 (Москва, стандартний час)
6
7
new
Date('September 20, 2020');
8
// Sun Sep 20 2020 00:00:00 GMT+0300 (Москва, стандартний час)
9
10
new
Date('20 September 2020');
11
// Sun Sep 20 2020 00:00:00 GMT+0300 (Москва, стандартний час)
12
13
new
Date('September 2020');
14
// Tue Sep 01 2020 00:00:00 GMT+0300 (Москва, стандартний час)
15
16
new
Date('2020 September');
17
// Tue Sep 01 2020 00:00:00 GMT+0300 (Москва, стандартний час)
18
19
new
Date('2020-09');
20
// Tue Sep 01 2020 03:00:00 GMT+0300 (Москва, стандартний час)
Також є можливість використовувати метод Date.parse(), який повертає тимчасову мітку у мілісекундах.
1new
Date('September 20, 2020');
2
// Sun Sep 20 2020 00:00:00 GMT+0300 (Москва, стандартний час)
3
4
Date.parse('September 20, 2020');
5
// 1600549200000
4. Надіслати набір параметрів у об'єкт Date
Ще один спосіб створити новий екземпляр об'єкта Date – передати до нього набір значень, відповідних до року, місяця (перший місяць дорівнює 0), дню, години, хвилин, секунд і мілісекунд.
1new
Date(2020,
8,
20,
18,
30,
10,
0);
2
// Sun Sep 20 2020 18:30:10 GMT+0300 (Москва, стандартний час)
У всіх випадках, зазначених вище, ми отримуємо дату, прив'язану до тимчасовій зоні нашого комп'ютера. Тобто, використовуючи однакові вхідні дані на різних комп'ютерах, можна отримати різні результати.
Javascript використовує UTC як базовий тимчасової зони, і виробляє автоматичну конверсію в локальну тимчасову зону вашого комп'ютера.
Як змінити Тимчасову Зону?
У нас є 2 варіанти зміни часової зони під час створення нового екземпляра об'єкта Date:
1new
Date('January 20, 2020 11:10:05 +0700');
1new
Date('January 20, 2020 11:10:05 (CET)');
Важливо враховувати, що, якщо 2-му випадку ви передасте назву тимчасової зони в неправильному форматі, Javascript автоматично буде використовувати зону UTC. При цьому ви не отримайте повідомлення про помилку.
У першому випадкупри передачі годин у неправильному форматі, Javascript сповістить вас помилкою "Invalid Date".
Об'єкт Date: Форматування
Об'єкт Date містить ряд методів, які повертають дату та час у форматі рядка:
1const
date
=
new
Date('September 20, 2020 11:10:05');
2
3date.toString();
4
// "Sun Sep 20 2020 11:10:05 GMT+0300 (Москва, стандартний час)"
5
6date.toTimeString();
7
// "11:10:05 GMT+0300 (Москва, стандартний час)"
8
9date.toDateString();
10
// "Sun Sep 20 2020"
11
12date.toUTCString();
13
// "Sun, 20 Sep 2020 08:10:05 GMT"
14
15date.toISOString();
16
// "2020-09-20T08:10:05.000Z"
17
18date.toLocaleTimeString();
19
// "11:10:05"
20
21date.toLocaleString();
22
// "20.09.2020, 11:10:05"
Javascript: Поточна дата та час (усі методи отримання)
Для отримання значень дати і часу використовуються такі методи:
1const
date
=
new
Date('September 20, 2020 11:10:05');
2
3date.getTime();
4
// 1600589405000
5
6date.getFullYear();
7
// 2020
8
9date.getDate();
10
// 20
11
12date.getDay();
13
// 0 (0 – означає Неділя, 1 – Понеділок)
14
15date.getMonth();
16
// 8 (0 - Січень)
17
18date.getHours();
19
// 11
20
21date.getMinutes();
22
// 10
23
24date.getSeconds();
25
// 5
26
27date.getMilliseconds();
28
// 0
29
30date.getTimezoneOffset();
31
// -180 (вказана різниця між локальним та UTC часом у хвилинах)
Також є можливість відразу отримувати значення дати та часу прив'язаних не локальній зоні комп'ютера користувача, а до зони UTC.
1date.getUTCFullYear();
2
// 2020
3
4date.getUTCDate();
5
// 20
6
7date.getUTCDay();
8
// 0
9
10date.getUTCMonth();
11
// 8 (0 - Січень)
12
13date.getUTCHours();
14
// 8 – Відрізняється від значення отриманого в локальній часовій зоні
15
16date.getUTCMinutes();
17
// 10
18
19date.getUTCSeconds();
20
// 5
21
22date.getUTCMilliseconds();
23
// 0 (0 – значення не вказано)
Встановлення Компонентів Дати та Часу
Для встановлення окремих компонентів дати або часу можна використовувати наступні методи:
1const
date
=
new
Date('September 20, 2020 11:10:05');
2
3
// 1. Встановлення нової дати
4date.setDate(22);
5
// 1600762205000 - отримуємо нову тимчасову мітку
6
7
// 2. Передамо нову мітку в об'єкт Date та отримаємо значення з оновленою датою
8
const
newDate
=
new
Date(1600762205000);
9
// Tue Sep 22 2020 11:10:05 GMT+0300 (Москва, стандартний час)
Інші методи встановлення окремих компонентів об'єкта Date:
1// використовується замість застарілого методу setYear()
2date.setFullYear(нове значення)
3date.setMonth(month)
4date.setHours(hour)
5date.setMinutes(min)
6date.setSeconds(sec)
7date.setMilliseconds(ms)
8date.setTime(ms)
Методи setHours() , setMinutes() і setSeconds() крім базових значень приймають значення хвилин, секунд або мілісекунд для більш точних установок. Формат введення виглядає такою бразою:
1setHours(18,
45,
20,
10);
2
setMinutes(min,
sec,
ms);
3
setSeconds(sec,
ms);
Варто пам'ятати, що якщо ми вкажемо оновлене значення годин наступним чином date.setHours(72) , то це призведе до оновленню нашої дати (додасться 3 дні).
Як отримати поточний час з об'єкта Javascript Date?
Для отримання поточного часу, вираженого в мілісекундах, можна використовувати метод Date.now() замість більш довгого варіанта new Date().getTime() .
Форматування Дати та Часу відповідно до різних мов.
API Інтернаціоналізації (Internationalization API) використовується для форматування дати та часу відповідно до потрібної мови.
Як приклад, можна навести відмінності у форматі написання дат у Росії (першим йде день - 31.01.2020) та США (першим йде місяць – 01.31.2020).
Усі методи інтернаціоналізації дат, часу та інших одиниць (валют) доступні в об'єкті Intl .
Метод Intl.DateTimeFormat()
У цьому пості нас цікавить метод Intl.DateTimeFormat(), який використовується для форматування дати та часу.
Розглянемо наступний приклад:
Давайте отримаємо дату у локальному форматі:
1const
date
=
new
Date('September 20, 2020 11:10:05');
2
new
Intl.DateTimeFormat().format(date);
3
// "20.09.2020"
Тепер отримаємо дату у форматі, який використовується в США. Для цього використовуємо параметр en-Us (англійська мова, що використовується в США):
1const
date
=
new
Date('September 20, 2020 11:10:05');
2
new
Intl.DateTimeFormat('en-Us').format(date);
3
// "9/20/2020"
Як Порівняти 2 Дати
Найпростіший спосіб порівняти 2 дати – використовувати метод Date.getTime().
1const
date1
=
new
Date('September 20, 2020 11:10:05');
2
const
date2
=
new
Date('September 25, 2020 11:10:05');
3
4
const
difference
=
date2.getTime()
-
date1.getTime();
5
// 432000000 – отримуємо різницю у мілісекундах
Також для порівняння дат можна використовувати умови if:
1if
(date2.getTime()
===
date1.getTime())
2
console.log('дати рівні');
3
// дати рівні
4
>
Використання Бібліотеки Moment.js
Moment.js - одна з найпопулярніших бібліотек для роботи з датою та часом у Javascript.
Розглянемо кілька прикладів її використання.
Спочатку встановлюємо пакет за допомогою команди npm install moment.
1// 1. Імпортуємо встановлений пакет:
2
import
moment
from
‘moment’;
3
4
// 2. Отримуємо поточну дату та час:
5
const
date
=
moment();
6
7
// 3. Ми можемо ініціалізувати новий об'єкт moment,
8
// Передавши в нього рядок з датою та часом
9
const
date
=
moment('September 20, 2020');
10
11
// 4. Далі можна вивести дату та час у потрібному форматі:
12
const
date
=
moment().format('MM Do, YYYY');
Список опцій форматування доступний у документації бібліотеки (пара прикладів):
Один з методів бібліотеки, які часто доводиться використовувати – fromNow() , який повертає кількість часу, що минув із зазначеної дати.
1moment('2020-06-20').fromNow();
2
// 3 місяці тому
Я використовую цей метод для відображення часу, який минув з дати публікації постів у блозі.
Змінні JavaScript var, let та const (у чому відмінність і коли використовувати)?
Тернарний оператор (умовний оператор Javascript).
Популярні статті
- Завдання JavaScript для початківців
- Типи даних JavaScript
- Як перевірити JavaScript на порожнечу?
- Обробники Події JS
- Деструктуризація Javascript
- Масиви Javascript: методи, що перебирають
- Оператори Spread та Rest в Javascript
- Об'єкт Date: Поточна Дата та Час у Javascript
- Змінні JavaScript var, let та const
Дата та час у JavaScript
У JavaScript існує вбудований об'єкт Date для обробки всіх операцій, пов'язаних з датою та часом. Наприклад, ви можете використовувати його для відображення поточної дати та часу, створення календаря, побудови таймера та багато іншого.
Як створити об'єкт Date
Щоб дізнатися, як створити новий об'єкт Date, виконайте кроки нижче.
Зауважте, що оператор new зазвичай використовується для створення об'єкта дати.
Викличте new Date () , вибравши один із таких аргументів:
Ви можете створити об'єкт Date для поточної дати та часу без аргументів, як це показано тут:
Ця дія повертає поточну дату з часом та тимчасовою зоною.
Можна виділити інші способи створення Date за допомогою оператора new.
Нова дата з мілісекундами
Створення об'єкта Date з часом, рівним числу мілісекунд, що пройшли після 1 січня 1970 року за UTC+0.
// 0 means 01.01.1970 UTC+0 let startDate = new Date(0); // console.log(startDate); 1000); console.log(startTime);
У цьому прикладі мітка часу використовується для представлення кількості мілісекунд, що пройшли з початку 1970 року.
Створення об'єкта Date за допомогою dateString
Можна створити об'єкт Date , передавши рядкову виставу дати.
let date = new Date("2019-12-26"); which the code is run // Про результат could be // Thu Dec 26 2019 04:00:00 GMT+1100 (Australian Eastern Daylight Time)
Допустимо наступний формат: new Date(year, month, date, hours, minutes, seconds, ms) . Ви також повинні дотримуватися цих правил:
- Year має складатися з чотирьох цифр (наприклад, 2020);
- Рахунок month повинен починатися з 0 (Наприклад, 0 це січень, а 11 це грудень);
- День місяця – це параметр date; якщо його немає, ви повинні припустити 1.
- Якщо hours/minutes/seconds/ms відсутні, ви повинні припустити, що вони рівні 0.
new Date(2019, 0, 1, 0, 0, 0, 0); // 1 Jan 2019, 00:00:00
new Date(2019, 0, 1); // the same, hours etc are 0 by default
Мінімальна точність має бути однією мілісекундою.
Доступ до компонентів дати
Тепер ми дізнаємось про способи доступу до компонентів даних. Ось вони:
отримання року (має бути 4 цифри).
одержання місяця (від 0 до 11).
одержання дня місяця (від 1 до 31).
getHours(), getMinutes(), getSeconds(), getMilliseconds()
одержання відповідних компонентів часу.
Важливо використовувати getFullYear() , а не getYear() , оскільки останній застарів і іноді може повертати рік з 2 цифр. Тому його краще ніколи не використовувати у практиці.
Крім того, можна навіть отримати день тижня, викликавши:
Це дозволить вам отримати день тижня від неділя 0 до субота 6.
Як встановити компоненти дати
У JavaScript використовуються кілька методів для встановлення компонентів дати та часу. Серед них:
setFullYear(year, [month], [date]) setMonth(month, [date]) setDate(date) setHours(hour, [min], [sec], [ms]) setMinutes(min, [sec], [ms])
Деякі методи можуть встановлювати кілька компонентів одночасно. Наприклад, setHours .
let today = новий Date(); today.setHours(0); console.log(today); // Still today, but the hour is changed to 0 today.setHours(0, 0, 0, 0); console.log(today); // still today, now 00:00:00 sharp.
Автокорекція
Зручною функцією об'єктів Date є автокорекція. Можна встановити значення, які виходять за межі діапазону, і вони автоматично скоригуються.
Дата у число, різниця в датах
Коли ви перетворюєте Date на число, він перетворюється на мітку часу, подібно date.getTime() .
Розглянемо наступний приклад:
let msDate = New Date(); console.log(+msDate); // it's a same as date.getTime(), it's number of milliseconds
Також важливо відзначити, що дати можуть бути вираховані. Ви можете використовувати це для вимірювання, як показано нижче:
let startDate = New Date(); // start measuring time for (let x = 0; x < 10000; x++) < let smth = x * x * x; >let endDate = New Date(); // end measuring time console.log(`The loop took $ ms`);
Date.now()
Якщо ви вирішите виміряти час, вам не обов'язково використовувати об'єкт Date. Ви можете використовувати Date.now(), який поверне поточну позначку часу.
let startDate = Date.now(); // milliseconds count from 1 Jan 1970 for (let x = 0; x < 10000; x++) < let doSomething = x * x * x; >let endDate = Date.now(); console.log(`The loop took $ ms`);
Date.parse з рядка
Якщо ви хочете прочитати дату рядка, Date.parse(str) допоможе вам. Формат рядка має бути: MM-DDTHH:mm:ss.sssZ . Також можливі кілька коротких варіантів: YYYY-MM-DD або YYYY-MM або навіть YYYY.
Ось приклад використання Date.parse(str):
let ms = Date.parse('2019-02-28T14:52:20.254-08:00'); console.log(ms); // 1551394340254, it's a timestamp
New Date може бути відразу створена з мітки часу, як це показано тут:
Резюме
JavaScript об'єкт Date використовується для представлення дати та часу. Об'єкт Date включає в себе обидва ці елементи. Загалом місяці вважаються, починаючи з нуля і закінчуючи 11. Дні тижня також вважаються, починаючи з нуля. У JavaScript дати можуть відніматися, і за цими відніманнями йде їхня різниця в мілісекундах, так як при перетворенні на число Date перетворюється на мітку часу. Нарешті, на відміну від інших систем, JavaScript мітки часу вказуються в мілісекундах, а не в секундах.
Час Вікторини: Перевірте свої навички!
отові перевірити свої знання? Пориньте в наші інтерактивні вікторини для більш глибокого розуміння та веселого способу закріпити знання.
Дата та час
Зустрічайте новий об'єкт: Date. Він містить дату та час, а також надає методи керування ними.
Наприклад, його можна використовувати для збереження часу створення/зміни, для вимірювання часу або просто для виведення поточної дати.
Створення
Для створення нового об'єкта Date потрібно викликати конструктор new Date() з одним із наступних аргументів:
Без аргументів – створити об'єкт Date з поточною датою та часом:
let now = new Date(); alert(now); // показує поточні дату та час
Створити об'єкт 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);
Якщо аргумент лише один, і це рядок, то з нього «прочитується» дата. Алгоритм аналізу – такий самий, як у 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 (тихоокеанський час)
Створити об'єкт 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() Отримати відповідно години, хвилини, секунди або мілісекунди.
Багато інтерпретаторів 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-варіанту:
Для заданої дати повертає таймстамп – кількість мілісекунд, що пройшли з 1 січня 1970 UTC+0.
Повертає різницю в хвилинах між 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 = новий 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 ( `Цикл відпрацював за $ мілісекунд`);
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 ( `Цикл відпрацював за $ мілісекунд`); // віднімаються числа, а чи не дати
Бенчмаркінг
Будьте уважні, якщо ви хочете точно протестувати продуктивність функції, яка залежить від процесора.
Наприклад, порівняємо дві функції, що обчислюють різницю між двома датами: яка спрацює швидше?
Подібні обчислення, що вимірюють продуктивність, також називають «бенчмарками» (benchmark).
// є date1 та date2, яка функція швидше поверне різницю між ними у мілісекундах? function diffSubtract(date1, date2) < return date2 - date1; >// чи function diffGetTime(date1, date2)
Обидві функції роблять буквально одне й те саме, тільки одна використовує явний метод 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
Сучасні інтерпретатори 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 з таймстампа: