Работа с Датой в JS

1. Класс Date

Работа с промежутками времени - это одна из наиболее популярных задач: часы, календари и прочее. JavaScript предоставляет класс Date, который абстрагирует большую часть работы с датами напрямую. Это позволяет нам представлять моменты во времени и манипулировать ими всего несколькими строками кода.

2. Создание даты

Создание даты очень просто. Просто создайте новый экземпляр встроенного класса Date.

const date = new Date();
console.log(date); // Mon Mar 19 2018 16:51:32 GMT+0200 (FLE Standard Time)
Copy

Поскольку не были переданы аргументы, будет создана текущая дата и время. Тем не менее, можно дополнительно передать строку или число в Date и результатом будет объект, описывающий указанную дату и время.

2.1. Datestring

Если передать строку, она будет обработана методом Date.parse(), чтобы вернуть объект Date.

Допустим необходимо создать событие на дату 4 марта 2017 года.

const date = new Date('March 4, 2017');
console.log(date); // Sat Mar 04 2017 00:00:00 GMT+0200 (FLE Standard Time)
Copy

2.2. 7 аргументов

Другой способ создания новых объектов Date — это передать 7 чисел. Эти числа описывают год, месяц, день, час, минуту, секунду и миллисекунду.

new Date(year, month, date, hours, minutes, seconds, ms)
Copy

Последние 4 аргумента необязательны.

const date = new Date(2000, 5, 8, 12, 0, 0, 0);

// Индексы месяцев начинаются с 0, поэтому 5-й месяц это июль.
console.log(date); // Thu Jun 08 2000 12:00:00 GMT+0300 (FLE Daylight Time)
Copy

3. Unix время

В области информатики существует концепция эпохи Unix. Этот момент времени установлен на полночь 1 января 1970 года в часовом поясе UTC.

С учетом этой системы отсчета, если вы передаете число объекту Date, это число представляет собой количество миллисекунд, прошедших с тех пор.

const date = new Date(1000000);
console.log(date); // Thu Jan 01 1970 02:16:40 GMT+0200 (FLE Standard Time)
Copy

Чтобы увидеть число миллисекунд от этой даты до текущего момента, используется статический метод Date.now().

const date = Date.now();
console.log(date); // 1521471595501
Copy

Удобство этого формата заключается в том, что можно представлять точные моменты времени в виде одного числа и не беспокоиться о датах, строках и часовых поясах, так как можно получить всю необходимую информацию когда необходимо.

4. Методы Date

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

4.1. Геттеры

Вот все методы получения информации из объекта Date:

const date = new Date();
console.log('Date: ' + date);

// возвращает день месяца от 1 до 31
console.log('getDate(): ' + date.getDate());

// возвращает день недели от 0 до 6
console.log('getDay(): ' + date.getDay());

// возвращает месяц от 0 до 11
console.log('getMonth(): ' + date.getMonth());

// возвращает год из 4 цифр
console.log('getFullYear(): ' + date.getFullYear());

// возвращает час
console.log('getHours(): ' + date.getHours());

// возвращает минуты
console.log('getMinutes(): ' + date.getMinutes());

// возвращает секунды
console.log('getSeconds(): ' + date.getSeconds());

// возвращает миллисекунды
console.log('getMilliseconds(): ' + date.getMilliseconds());

// возвращает кол-во миллисекунд прошедших со старта эпохи Unix
console.log('getTime(): ' + date.getTime());
Copy

Давайте поэкспериментируем:

const date = new Date();

// проверим количество мс с с начала эпохи Unix
console.log(`Время в мс с начала эпохи Unix: ${date.getTime()}`);
// "Время в мс с начала эпохи Unix: ....  значения будут меняться :-)
// "Время в мс с начала эпохи Unix: 1504721892483"

let result = 'Date: ';
result += date.getFullYear() + '/'; // год
result += date.getMonth() + '/'; // месяц, начиная с 0
result += date.getDate() + '. Day of week: '; // день недели, начиная с 1
result += date.getDay() + '.'; // день , начиная с 0

result += ' Time: ' + date.getHours() + ':'; // часы
result += date.getMinutes() + ':'; // минуты
result += date.getSeconds() + ':'; // секунды
result += date.getMilliseconds() + ''; // милисекунды

// строка должна показать текущее время и дату
console.log(result); // "Date: 2017/8/6. Day of week: 3. Time: 21:18:12:483"
// ...  значения будут меняться :-)
Copy

4.2. Сеттеры

Все, что можно прочитать можно записать, методы для записи начинаются с set*.

// Для установки даты существует 2 способа. Установим 1500000000000мс
// с начала эры Unix с помощью конструктора
const date = new Date(2017, 6, 14, 5, 40, 0, 0);

// Проверим
console.log(`2017, 6, 14, 5, 40 соответствует ${date.getTime()}`);
// "2017, 6, 14, 5, 40 соответствует 1500000000000"

/* С помощью методов set */
// Создадим новый объект с текущей датой
const secondDate = new Date();

// Изменим год и в нем же месяц и день месяца
secondDate.setFullYear(2017, 6, 14);
// Изменим час и в нем же минуты, секунды и милисекунды
secondDate.setHours(5, 40, 0, 0);

// Проверим
console.log(`2017, 6, 14, 5, 40 соответствует ${secondDate.getTime()}`);
// "2017, 6, 14, 5, 40 соотвествует 1500000000000"
Copy

5. Форматирование и вывод дат

Во всех браузерах, кроме IE10-, поддерживается новый стандарт, который добавляет специальные методы для форматирования дат.

Это делается вызовом date.toLocaleString(locale, opts), в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести и ряд настроек вывода, после чего интерпретатор сам сформирует строку.

let date = new Date();

// формат вывода
const options = {
  weekday: 'long',
  year: 'numeric',
  month: 'short',
  day: 'numeric',
  hour: '2-digit',
  minute: '2-digit',
};

// Украина
const localeUk = date.toLocaleString('Uk-uk', options);
console.log(localeUk); // понеділок, 19 бер. 2018 р., 17:42

// USA
const localeUs = date.toLocaleString('en-US', options);
console.log(localeUs); // Monday, Mar 19, 2018, 5:43 PM
Copy

5.1. Методы вывода без локализации

toString(), toDateString(), toTimeString() возвращают стандартное строчное представление, не заданное жёстко в стандарте, а зависящее от браузера. Единственное требование к нему — читаемость человеком. Метод toString() возвращает дату целиком, toDateString() и toTimeString() — только дату и время соответственно.

6. Дополнительные материалы

Last updated