Даты и время в JS

что такое объект Date

Date — это специальный объект для работы со временем. Он является встроенным в движок браузера, поэтому посмотреть что у него внутри не так-то просто. Источники сообщают, что внутри него хранится timestamp (количество миллисекунд с 1 января 1970 года UTC) и какая-то магия.

Что важно понять?

В объекте date мы не можем разделить дату и время — это единая сущность. Нельзя просто так взять и задать только время без даты.

Почему?

Потому что внутри объекта записано количество миллисекунд, которое преобразуется в «человеческий» формат с помощью чёртовой матери магии.

Про магию и почему важно использовать объект Date в программировании

т.к. работа со временем крутится вокруг таймстампа, то часто можно увидеть что-то вроде этого:
let Jan02_1970 = new Date(24 * 60 * 60 * 1000); //получим 02.01.1970 UTC+0
или этого
const milliseconds = 31449600000;
let days = milliseconds / (1000 * 60 * 60 * 24)//получим 364 дня
и кажется, что ну вот же всё просто: бери и переводи миллисекунды в дни/часы/месяцы. Зачем же тогда вообще нужен специальный объект для работы со временем?
Но кроме очевидных високосных годов и переводов часов на летнее время, существуют ситуации, когда сутки становятся длиннее на секунду. А если возникает необходимость работы с историческими датами, можно вспомнить историю о том, как в 1908 сборная России опоздала на Олимпиаду из-за того, что Россия на тот момент ещё пользовалась юлианским календарем, в то время как Англия уже перешла на григорианский.
Как раз все эти нюансы учтены внутри объекта Date, чтобы мы могли получить верную дату.

Как создать объект Date

создаём Date с текущей датой и временем:

const now = new Date();
console.log(nowDate);
// 

Далее создадим одну и ту же дату тремя разными способами

создаём Date с переданным значением времени. Значение должно быть совместимым с IETF RFC 2822 или с ISO8601:
const fromString = new Date('June 30, 2016 01:57:16');
console.log(fromString);
//
создаём объект Date с временем, равным количеству миллисекунд (тысячная доля секунды), прошедших с 1 января 1970 года UTC+0:
const fromMiliseconds = new Date(1467295036000);
console.log(fromMiliseconds);
// 
создаём объект Date с заданными параметрами (год, месяц, день, часы, минуты, секунды, миллисекунды) в местном часовом поясе. Обязательны только первые два аргумента. Остальные параметры, начиная с часов, будут по умолчанию равны 0, а день — 1:
const fromParameters = new Date(2016, 5, 30, 1, 57, 16);
console.log(fromParameters);
//

Методы работы с датой

Далее можно попробовать ввести дату разными способами и посмотреть, что возвращают get-методы
        
const currentDate = new Date('August 14, 2022 14:15:30')
console.log(currentDate.getTime())
// 1660475730000        
console.log(currentDate.getFullYear())
// 2022     
console.log(currentDate.getMonth())
// 0         
console.log(currentDate.getDate())
// 0         
console.log(currentDate.getDay())
// 0         
console.log(currentDate.getHours())
// 0         
console.log(currentDate.getMinutes())
// 0         
console.log(currentDate.getSeconds())
// 0         
console.log(currentDate.getMilliseconds())
// 0         
console.log(currentDate.getTimezoneOffset())
// 14       
console.log(currentDate.toISOString())
// 2022-08-14T11:15:30.000Z
        
    

а ещё

С датами можно производить математические операции. Главное помнить, что мы просто складываем или вычитаем количество миллисекунд! Поэтому если вы заранее не привели ваши даты к utc формату, то результат может быть некорректным.
Ещё очень важная и крутая возможность — это автоисправление даты. Можно задать 32 декабря и оно превратится в 1 января.

const newDate = new Date(2022, 11, 32);
// 2023-01-01