Объект 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;2new 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// 16008553521163new 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 (Москва, стандартное время)34new Date('2020/09/20');5// Sun Sep 20 2020 00:00:00 GMT+0300 (Москва, стандартное время)67new Date('September 20, 2020');8// Sun Sep 20 2020 00:00:00 GMT+0300 (Москва, стандартное время)910new Date('20 September 2020');11// Sun Sep 20 2020 00:00:00 GMT+0300 (Москва, стандартное время)1213new Date('September 2020');14// Tue Sep 01 2020 00:00:00 GMT+0300 (Москва, стандартное время)1516new Date('2020 September');17// Tue Sep 01 2020 00:00:00 GMT+0300 (Москва, стандартное время)1819new 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 (Москва, стандартное время)34Date.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');23date.toString();4// "Sun Sep 20 2020 11:10:05 GMT+0300 (Москва, стандартное время)"56date.toTimeString();7// "11:10:05 GMT+0300 (Москва, стандартное время)"89date.toDateString();10// "Sun Sep 20 2020"1112date.toUTCString();13// "Sun, 20 Sep 2020 08:10:05 GMT"1415date.toISOString();16// "2020-09-20T08:10:05.000Z"1718date.toLocaleTimeString();19// "11:10:05"2021date.toLocaleString();22// "20.09.2020, 11:10:05"
Javascript: Текущая дата и время (все методы получения)
Для получения значений даты и времени используются следующие методы:
1const date = new Date('September 20, 2020 11:10:05');23date.getTime();4// 160058940500056date.getFullYear();7// 202089date.getDate();10// 201112date.getDay();13// 0 (0 – означает Воскресенье, 1 - Понедельник)1415date.getMonth();16// 8 (0 - Январь)1718date.getHours();19// 112021date.getMinutes();22// 102324date.getSeconds();25// 52627date.getMilliseconds();28// 02930date.getTimezoneOffset();31// -180 (указана разница между локальным и UTC временем в минутах)
Также есть возможность сразу получать значения даты и времени привязанных не локальной зоне компьютера пользователя, а к зоне UTC.
1date.getUTCFullYear();2// 202034date.getUTCDate();5// 2067date.getUTCDay();8// 0910date.getUTCMonth();11// 8 (0 - Январь)1213date.getUTCHours();14// 8 – Отличается от значения полученного в локальной временной зоне1516date.getUTCMinutes();17// 101819date.getUTCSeconds();20// 52122date.getUTCMilliseconds();23// 0 (0 – значение не указано)
Установка Компонентов Даты и Времени
Для установки отдельных компонентов даты или времени можно использовать следующие методы:
1const date = new Date('September 20, 2020 11:10:05');23// 1. Установка новой даты4date.setDate(22);5// 1600762205000 - получаем новую временную метку67// 2. Передадим новую метку в объект Date и получим значение с обновленной датой8const 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);2setMinutes(min, sec, ms);3setSeconds(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');2new Intl.DateTimeFormat().format(date);3// "20.09.2020"
Теперь получим дату в формате, который используется в США.
Для этого используем параметр en-Us
(английский язык, используемый в США (US)):
1const date = new Date('September 20, 2020 11:10:05');2new Intl.DateTimeFormat('en-Us').format(date);3// "9/20/2020"
Как Сравнить 2 Даты
Самый простой способ сравнить 2 даты – использовать метод Date.getTime()
.
1const date1 = new Date('September 20, 2020 11:10:05');2const date2 = new Date('September 25, 2020 11:10:05');34const 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. Импортируем установленный пакет:2import moment from ‘moment’;34// 2. Получаем текущую дату и время:5const date = moment();67// 3. Мы можем инициализировать новый объект moment,8// передав в него строку с датой и временем9const date = moment('September 20, 2020');1011// 4. Далее можно вывести дату и время в нужном формате:12const date = moment().format('MM Do, YYYY');
Список опций форматирования доступен в документации библиотеки (пара примеров):
YYYY-MM-DD
- 2017-12-14HH:mm:ss
- 16:34:10
Один из методов библиотеки, которые часто приходится использовать – fromNow()
,
который возвращает количество времени, которое прошло с указанной даты.
1moment('2020-06-20').fromNow();2// 3 месяца назад
Я использую этот метод для отображения времени, которое прошло с даты публикации постов в блоге.