для Epic Skills
Date
В JavaScript дата определяется количеством миллисекунд,
прошедших с 1 января 1970 года.
Для работы с датой и временем применяется встроенный объект Date. Этот объект не имеет свойств, но обладает несколькими методами, позволяющими устанавливать и изменять дату и время.
При создании без аргументов объект даты возвращает текущую дату:
new Date();
При создании с единственным аргументом в виде числа, дата будет равна количеству миллисекунд (1/1000 секунды), прошедших с 1 января 1970 года GMT+0.
new Date(0); // начало UNIX-эпохи
Прибавим 24 часа к дате начала UNIX-эпохи
var milliseconds = 24 * 60 * 60 * 1000;
var unixZero = new Date(0);
var unixDay = new Date(milliseconds);
Дату можно создать, используя компоненты даты.
new Date(2017, 6, 3, 19, 0, 0, 0);
Прибавим 24 часа к дате начала UNIX-эпохи
var milliseconds = 24 * 60 * 60 * 1000;
var unixZero = new Date(0);
var unixDay = new Date(milliseconds);
Возможно также создать дату из строки в специальном формате при помощи метода Date.parse
: YYYY-MM-DDTHH:mm:ss.sssZ
— YYYY-MM-DD
– дата в формате год-месяц-день.
— Буква T
используется как разделитель.
— HH:mm:ss.sss
– время: часы-минуты-секунды-миллисекунды.
— Часть Z
обозначает временную зону – в формате +-hh:mm
, либо символ Z
, обозначающий UTC. По стандарту её можно не указывать, тогда UTC, но в Safari с этим ошибка, так что лучше указывать всегда.
Также возможны укороченные варианты, например YYYY-MM-DD
или YYYY-MM
или даже только YYYY
.
Метод Date.parse(datestring)
разбирает строку datestring в таком формате и возвращает соответствующее ей количество миллисекунд. Если это невозможно, Date.parse
возвращает NaN
.
new Date('2017');
new Date('2017-06-03');
new Date('2017-06-03T19:10:05.101+03:00');
new Date('2017-06-03T19:10:05.101Z');
Можно получить кол-во миллисекунд эпохи
var now = new Date();
now.getTime();
//
Но есть способ ещё проще!
Date.now();
//
Очень удобно оказывается оперировать датами в миллисекундах для получения новых дат. Например, можно вычислить дату "через год"
var oneYear = 12 * 31 * 24 * 60 * 60 * 1000;
var datePlusYear = new Date(Date.now() + oneYear);
//
Методами объекта Date
можно получать отдельно значения дате:
getDay
- день недели, целое число от 0 (воскресенье) до 6 (суббота).getDate
- номер дня в месяце, целое число от 1 до 31.getMonth
- месяц в году, целое число от 0 (январь) до 11 (декабрь).getYear
- год в виде двух последних цифр, но есть баги в IE и FF.getFullYear
- год в виде четырех цифр.
Можно также получать отдельно значения времени:
getHours
- возвращает час суток в диапазоне от 0 (полночь) до 23.getMinutes
- возвращает минуты в диапазоне от 0 до 59.getSeconds
- возвращает секунды в диапазоне от 0 до 59.getMilliseconds
- возвращает миллисекунды в диапазоне от 0 до 59.
Предположим, нам нужно текущее время в формате "чч:мм:сс"
var date = new Date();
var hours = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
var results = hours + ":" + minutes + ":" + seconds;
//
Все пройденные методы возвращают дату местной временной зоны.
Существуют также UTC-варианты этих методов, возвращающие день, месяц, год и т.п. для зоны GMT+0 (UTC): getUTCFullYear()
, getUTCMonth()
, getUTCHours()
.
То есть, сразу после "get" вставляется "UTC".
var now = new Date();
now.getHours();
// now.getUTCHours();
// Иногда требуется узнать разницу между местным временем и UTC.
Функция getTimezoneOffset()
вернёт эту разницу, в минутах.
new Date().getTimezoneOffset()
//
setDate
, setHours
, setMinutes
, setSeconds
, setFullYear
, setMonth
- те же методы, только для изменения компонентов даты.
setTime
- устанавливает значение объекта Date и возвращает количество миллисекунд, прошедших с 1 января 1970 года.
Все они, кроме setTime()
, обладают также UTC-вариантом, например: setUTCHours()
.
Мы можем вычислить дату "через год" и при помощи метода setYear
var now = new Date();
var datePlusYear = now.setFullYear(2018);
//
Будьте бдительны! Здесь мы не только записали в переменную datePlusYear
дату на год позже, но и изменили исходную дату now
var now = new Date();
now.setFullYear(2016);
now.setFullYear(2018, 2, 19);
now.setMonth(7);
Можно устанавливать заведомо некорректные компоненты (например 13 месяц), а объект сам себя поправит.
При этом неправильные компоненты даты автоматически распределяются по остальным.
Вот пример безумной даты:
var date = new Date(2017, 13, 32, 25, 61, 61, 1001);
Это можно использовать для получения даты, отдаленной от имеющейся на нужный промежуток времени. Например, получим дату на 70 секунд большую текущей:
var date = new Date(2017, 1, 28);
date.setSeconds(date.getSeconds() + 70);
Например, нужно увеличить на 2 дня дату «28 февраля 2011». Может быть так, что это будет 2 марта, а может быть и 1 марта, если год високосный. Но нам обо всем этом думать не нужно. Просто прибавляем два дня. Остальное сделает Date
:
var date = new Date(2011, 1, 28);
date.setDate(date.getDate() + 2);
Даты можно вычитать, результат вычитания объектов Date – их временная разница, в миллисекундах.
var startDate = new Date(2017, 6, 3, 19);
var endDate = new Date(2017, 6, 3, 22);
console.log(endDate - startDate);
Также их можно и сравнивать
var startDate = new Date(2017, 6, 3, 19);
var endDate = new Date(2017, 6, 3, 22);
console.log(endDate > startDate);
console.log(endDate < startDate);
Выполнение любой функции можно повторять раз в заданное время
function hi() {
console.log('hi');
}
var interval = setTimeout(hi, 1000);
Бесконечо повторяемую функцию можно остановить
clearInterval(interval);
Как исполнить функцию не сразу, а, например, через 3 секунды?
function hi() {
console.log('hi');
}
var timeout = setTimeout(hi, 3000);
Можно предотвратить запуск функции с таймаутом
clearTimeout(timeout);