☕ Учебник по JavaScript: работа с датой и временем
Разбираемся в стандартных функциях для работы с датой и временем в JavaScript, пробуем разные манипуляции и форматы вывода, а также знакомимся с библиотекой Day.js.
Создание даты
Для получения даты используется объект Date
. Существует четыре способа создания объекта даты и времени:
new Date()
– создание объекта с текущей датой и временем без указания параметров.
let date = new Date(); console.log(date); // 2022-05-25T05:09:41.041Z
new Date(value)
– с передачей параметраvalue,
который показывает количество миллисекунд, прошедших с 1 января 1970 г. GMT+0.
let date = new Date(3600*24*1000); console.log(date); // 1970-01-02T00:00:00.000Z
new Date(string)
– параметрstring
содержит дату в формате строки. Передаваемая строка должна соответствовать стандартным форматам ISO 8601 или RFC 2822. Подробнее о формате ISO 8601 на странице (вики) и о RFC 2822 на странице (англ.).
let date_string_1 = new Date('2022-05-25 9:00'); console.log(date_string_1); // 2022-05-25T09:00:00.000Z let date_string_2 = new Date('25 May 2022 13:30:00 GMT'); console.log(date_string_2); // 2022-05-25T13:30:00.000Z
new Date(year, month, day, hour, minutes, seconds)
– создание объекта с набором необязательных параметров:year
– целое четырехзначное число,month
– число от нуля (январь) до одиннадцати (декабрь),day
,hour
,minutes
,seconds
– целые числа.
let date_1 = new Date(2022,4,25); console.log(date_1); // 2022-05-25T00:00:00.000Z let date_2 = new Date(2022,4,32); console.log(date_2); // 2022-06-01T00:00:00.000Z
В JS поддерживается проверка ввода дней, часов, минут, секунд и миллисекунд.
Получение отдельных компонентов даты и времени
Получение отдельных компонентов даты и времени возможно с помощью следующих методов:
getFullYear()
– получение четырехзначного значения года;getMonth()
– получение значения месяца от 0 (январь) до 11 (декабрь);getDate()
– получение числа дня в месяце;getHours()
– количество часов;getMinutes()
– количество минут;getDay()
– получение номера дня недели от нуля (воскресенье) до шести (суббота);getTime()
– получение количества миллисекунд, прошедших с 1 января 1970 г. UTC.
let date = new Date(2022,4,25,13,30); console.log(date.getFullYear()); // 2022 console.log(date.getMonth()); // 4 console.log(date.getDate()); //25 console.log(date.getHours()); // 13 console.log(date.getMinutes()); // 30 console.log(date.getDay()); // 3 console.log(date.getTime()); // 1653485400000
Установка отдельных компонентов даты и времени
Для установки отдельных компонентов используются методы:
setFullYear(year)
– для установки года, гдеyear
– четырехзначное число;setMonth(month)
– для установки месяца от 0 до 11;setDate(date)
– число месяца,date
– целое число;setHours(hours)
– часы, гдеhours
– целое число;setMinutes(minutes)
,setSeconds(seconds)
,setMilliseconds(milliseconds)
– для установки минут, секунд, миллисекунд, где параметрыminutes
,seconds
,milliseconds
– целые числа;setTime(milliseconds)
– устанавливает в соответствии с параметром миллисекундами –milliseconds
, прошедших с 1 января 1970 г. UTC.
let date = new Date(2022,4,25,13,30); date.setFullYear(2021); date.setMonth(3); date.setDate(12); date.setHours(12); date.setMinutes(15); console.log(date); //2021-04-12T12:15:00.000Z
Как получить из даты строку?
Чтобы получить из объекта даты строку, используются два типа методов.
Для даты в часовом поясе UTC:
toString()
– получение полной строки даты и времени;toDateString()
– строка только с указанием даты и дня недели;toTimeString()
– только время;toISOString()
– преобразование строки в формат ISO.
Перечисленные методы возвращают представление даты во временной зоне UTC:
let date = new Date(2022,4,25,11,35,22,434); console.log(date.toString()); // Wed May 25 2022 11:35:22 GMT+0000 (GMT) console.log(date.toDateString()); //Wed May 25 2022 console.log(date.toTimeString()); //11:35:22 GMT+0000 (GMT) console.log(date.toISOString()); //2022-05-25T11:35:22.434Z
Для получения даты локального часового пояса и языка:
toLocaleString(locales, options)
– дата и время в виде строки локали;toLocaleDateString(locales, options)
– строка только из даты;toLocaleTimeString(locales, options)
– получение только времени.
Методы возвращают значение даты с учетом локального часового пояса и языка. Параметры locales
, options
– необязательные.
let date = new Date(2022,4,25,11,35,22); console.log(date.toLocaleString()); // 25.05.2022, 11:35:22 console.log(date.toLocaleDateString()); // 25.05.2022 console.log(date.toLocaleTimeString()); // 11:35:22
Без указания параметров будет использован установленный часовой пояс и язык на компьютере. Подробнее об этих аргументах ниже – в разделе «Метод Intl.DateTimeFormat()».
Как получить из строки дату?
Метод Date.parse(string)
принимает на вход строку в формате RFC2822 или ISO, а возвращает количество миллисекунд, прошедших с 1 января 1970 г. UTC.
let date = Date.parse('2022-05-25T11:00:00'); console.log(date); //1653476400000 console.log(new Date(date)); //2022-05-25T11:00:00.000Z
Примечание: неявный вызов метода parse()
используется в конструкторе с параметром строки: new Date(dateString)
.
Как указать временную зону?
Объекты даты изначально создаются во временной зоне UTC в качестве базовой. Поэтому, чтобы явно указать временную зону, объект Date
принимает в параметры строку с обозначением временного пояса.
Создание с добавлением +-hhmm
выглядит так: new Date('May 25, 2022 11:10:00 +03:00')
.
let date = new Date('May 25, 2022 11:30 +03:00') console.log(date); // 2022-05-25T08:30:00.000Z
Как получить текущее время?
Для того чтобы получить текущую дату и время, используйте создание Date
с пустым конструктором: new Date()
;
let date = new Date(); console.log(date); // 2022-05-25T11:00:00.000Z
Обратите внимание, что метод возвращает время в часовом поясе UTC.
Для получения даты в миллисекундах используется метод Date.now()
без создания объекта.
console.log(Date.now()); // 1653476400000
Как сравнить две даты?
Для сравнения используется метод приведения даты к миллисекундам – getTime()
:
let date_1 = new Date('May 20, 2022'); let date_2 = new Date('May 25, 2022'); console.log(date_2.getTime() === date_1.getTime()); // false date_1.setDate(25); console.log(date_2.getTime() === date_1.getTime()); // true
Как альтернативный вариант, но не самый лучший – приведение двух дат к строкам с помощью методов получения строки и дальнейшее сравнение:
let date_1 = new Date('May 25, 2022'); let date_2 = new Date('May 25, 2022'); console.log(date_2.toString() === date_1.toString());
Примечание: будьте осторожны, отличие хоть на секунду вернет при сравнении false
.
Форматирование даты в соответствии с разными языками
Для вывода даты в соответствии с местным временем используются стандартные функции. Что делать, если необходима поддержка и другого формата? Объект Intl
– предоставляет функции сравнения строк в разных языковых форматах, форматирования чисел и дат со временем.
Метод Intl.DateTimeFormat() для вывода строк в разных языковых форматах
Создание объекта: new Intl.DateTimeFormat(locales, options)
, где:
locales
– необязательный параметр. Строка или массив из трех компонентов, которые содержит код языка, код способа записи и код страны. Например, указание может состоять:ru
– русский язык,en-GB
– английский язык- Англия (GB),en-US
– английский язык – СШАUS
. Больше языков приведено на сайте (англ.).options
– необязательный параметр. Объект дополнительных настроек. Содержит следующие поля:localeMatcher
– алгоритм сопоставления локалей, принимает значения:lookup
,best fit
– по умолчанию.timeZone
– указание часового пояса, значение по умолчанию – часовой пояс по умолчанию среды выполнения.hour12
– использование 12-часового формата времени, значения:true
,false
. По умолчанию устанавливается использование формата локального времени.formatMatcher
– алгоритм сопоставления форматов, значения:basic
,best fit
– по умолчанию.
Дальнейший перечень свойств, которые описывают компоненты даты и времени, используемые в форматированном выводе, и желаемые представления показаны на странице. Их использование необязательно.
Создание даты в локальном формате:
let date = new Date('May 25, 2022 13:30:00'); console.log(new Intl.DateTimeFormat().format(date)); // 25.05.2022
C использованием параметра locales
:
let date = new Date(); console.log(new Intl.DateTimeFormat('en-Us').format(date)); // 5/25/2022
Использование библиотеки Day.js
Компактная библиотека JavaScript для работы с датой и временем. Day.js содержит функции разбора строки, валидации, преобразования форматов, разных видов манипуляций и сравнения двух дат.
Библиотека работает в современных браузерах, поэтому для работы достаточно вставить перед тегом </body>
:
<script src="<https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.8.17/dayjs.min.js>"></script>
Примеры работы с библиотекой:
- Создание объекта даты:
let date = dayjs('May 25, 2022 11:35:55 +0300'); console.log(date.format()); // 2022-05-25T11:35:55+03:00
- Установка отдельных компонент даты и времени:
let date = dayjs('May 25, 2022 11:35:55 +0300'); date = date.add(2,'day'); date = date.add(1,'hour'); date = date.add(5,'minute'); console.log(date.format()); // 2022-05-27T12:40:55+03:00
- Сравнение двух дат:
let date_old = dayjs('May 25, 2022 11:35:55 +0300'); let date_new = date_old.add(2,'day'); console.log(date_new.isAfter(date_old));// true
Полную документация по использованию библиотеки смотрите на официальном сайте библиотеки.