Разбор строки с датой
Метод Date.parse(str) считывает дату из строки.
Формат строки должен быть следующим: YYYY-MM-DDTHH:mm:ss.sssZ
, где:
YYYY-MM-DD
– это дата: год-месяц-день.- Символ
"T"
используется в качестве разделителя. HH:mm:ss.sss
– время: часы, минуты, секунды и миллисекунды.- Необязательная часть
'Z'
обозначает часовой пояс в формате+-hh:mm
. Если указать просто буквуZ
, то получим UTC+0.
Возможны и более короткие варианты, например, YYYY-MM-DD
или YYYY-MM
, или даже YYYY
.
Вызов Date.parse(str)
обрабатывает строку в заданном формате и возвращает таймстамп (количество миллисекунд с 1 января 1970 года UTC+0). Если формат неправильный, возвращается NaN
.
Например:
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (таймстамп)
Можно тут же создать объект new Date
из таймстампа:
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );
alert(date);
Итого
- Дата и время в JavaScript представлены объектом Date. Нельзя создать «только дату» или «только время»: объекты
Date
всегда содержат и то, и другое. - Счёт месяцев начинается с нуля (да, январь – это нулевой месяц).
- Дни недели в
getDay()
также отсчитываются с нуля, что соответствует воскресенью. - Объект
Date
самостоятельно корректируется при введении значений, выходящих за рамки допустимых. Это полезно для сложения/вычитания дней/месяцев/недель. - Даты можно вычитать, и разность возвращается в миллисекундах. Так происходит, потому что при преобразовании в число объект
Date
становится таймстампом. - Используйте
Date.now()
для быстрого получения текущего времени в формате таймстампа.
Учтите, что, в отличие от некоторых других систем, в JavaScript таймстамп в миллисекундах, а не в секундах.
Порой нам нужно измерить время с большей точностью. Собственными средствами JavaScript измерять время в микросекундах (одна миллионная секунды) нельзя, но в большинстве сред такая возможность есть. К примеру, в браузерах есть метод performance.now(), возвращающий количество миллисекунд с начала загрузки страницы с точностью до микросекунд (3 цифры после точки):
alert(`Загрузка началась ${performance.now()}мс назад`);
// Получаем что-то вроде: "Загрузка началась 34731.26000000001мс назад"
// .26 –- это микросекунды (260 микросекунд)
// корректными являются только первые три цифры после точки, а остальные -- это ошибка точности
В Node.js для этого предусмотрен модуль microtime
и ряд других способов. Технически почти любое устройство или среда позволяет добиться большей точности, просто её нет в объекте Date
.
Практика
Создайте дату
важность: 5
Создайте объект Date
для даты: 20 февраля 2012 года, 3 часа 12 минут. Временная зона – местная.
Для вывода используйте alert
.
Покажите день недели
важность: 5
Напишите функцию getWeekDay(date)
, показывающую день недели в коротком формате: «ПН», «ВТ», «СР», «ЧТ», «ПТ», «СБ», «ВС».
Например:
let date = new Date(2012, 0, 3); // 3 января 2012 года
alert( getWeekDay(date) ); // нужно вывести "ВТ"
День недели в европейской нумерации
важность: 5
В Европейских странах неделя начинается с понедельника (день номер 1), затем идёт вторник (номер 2) и так до воскресенья (номер 7). Напишите функцию getLocalDay(date)
, которая возвращает «европейский» день недели для даты date
.
let date = new Date(2012, 0, 3); // 3 января 2012 года
alert( getLocalDay(date) ); // вторник, нужно показать 2
Какой день месяца был много дней назад?
важность: 4
Создайте функцию getDateAgo(date, days)
, возвращающую число, которое было days
дней назад от даты date
.
К примеру, если сегодня двадцатое число, то getDateAgo(new Date(), 1)
вернёт девятнадцатое и getDateAgo(new Date(), 2)
– восемнадцатое.
Функция должна надёжно работать при значении days=365
и больших значениях:
let date = new Date(2015, 0, 2);
alert( getDateAgo(date, 1) ); // 1, (1 Jan 2015)
alert( getDateAgo(date, 2) ); // 31, (31 Dec 2014)
alert( getDateAgo(date, 365) ); // 2, (2 Jan 2014)
P.S. Функция не должна изменять переданный ей объект date
.
Последнее число месяца?
важность: 5
Напишите функцию getLastDayOfMonth(year, month)
, возвращающую последнее число месяца. Иногда это 30, 31 или даже февральские 28/29.
Параметры:
year
– год из четырёх цифр, например, 2012.month
– месяц от 0 до 11.
К примеру, getLastDayOfMonth(2012, 1) = 29
(високосный год, февраль).
Сколько сегодня прошло секунд?
важность: 5
Напишите функцию getSecondsToday()
, возвращающую количество секунд с начала сегодняшнего дня.
Например, если сейчас 10:00
, и не было перехода на зимнее/летнее время, то:
getSecondsToday() == 36000 // (3600 * 10)
Функция должна работать в любой день, т.е. в ней не должно быть конкретного значения сегодняшней даты.решение
Сколько секунд осталось до завтра?
важность: 5
Создайте функцию getSecondsToTomorrow()
, возвращающую количество секунд до завтрашней даты.
Например, если сейчас 23:00
, то:
getSecondsToTomorrow() == 3600
P.S. Функция должна работать в любой день, т.е. в ней не должно быть конкретного значения сегодняшней даты.решение
Форматирование относительной даты
важность: 4
Напишите функцию formatDate(date)
, форматирующую date
по следующему принципу:
- Если спустя
date
прошло менее 1 секунды, вывести"прямо сейчас"
. - В противном случае, если с
date
прошло меньше 1 минуты, вывести"n сек. назад"
. - В противном случае, если меньше часа, вывести
"m мин. назад"
. - В противном случае, полная дата в формате
"DD.MM.YY HH:mm"
. А именно:"день.месяц.год часы:минуты"
, всё в виде двух цифр, т.е.31.12.16 10:00
.
Например:
alert( formatDate(new Date(new Date - 1)) ); // "прямо сейчас"
alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 сек. назад"
alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 мин. назад"
// вчерашняя дата вроде 31.12.2016, 20:00
alert( formatDate(new Date(new Date - 86400 * 1000)) );