Даты

для Epic Skills

Даты

Объект Date

В JavaScript дата определяется количеством миллисекунд,
прошедших с 1 января 1970 года.

Для работы с датой и временем применяется встроенный объект Date. Этот объект не имеет свойств, но обладает несколькими методами, позволяющими устанавливать и изменять дату и время.

Создать дату

При создании без аргументов объект даты возвращает текущую дату:
new Date();

Создать дату из числа

При создании с единственным аргументом в виде числа, дата будет равна количеству миллисекунд (1/1000 секунды), прошедших с 1 января 1970 года GMT+0.

UNIX-время

new Date(0); // начало UNIX-эпохи

GMT+0

GMT+3

Создать дату из числа

Прибавим 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');

Компоненты
даты

Миллисекунды UNIX-эпохи

Можно получить кол-во миллисекунд эпохи

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-дата

Все пройденные методы возвращают дату местной временной зоны.

Существуют также UTC-варианты этих методов, возвращающие день, месяц, год и т.п. для зоны GMT+0 (UTC): getUTCFullYear(), getUTCMonth(), getUTCHours().

То есть, сразу после "get" вставляется "UTC".

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

Таймеры

setInterval

Выполнение любой функции можно повторять раз в заданное время

function hi() {
  console.log('hi');
}
var interval = setTimeout(hi, 1000);

clearInterval

Бесконечо повторяемую функцию можно остановить

clearInterval(interval);

setTimeout

Как исполнить функцию не сразу, а, например, через 3 секунды?

function hi() {
  console.log('hi');
}
var timeout = setTimeout(hi, 3000);

clearTimeout

Можно предотвратить запуск функции с таймаутом

clearTimeout(timeout);