Автоматическая корректировка дат в JavaScript

JavaScript имеет очень интересную и полезную особенность: если при создании объекта Date был указан некорректный момент времени - он автоматически будет пересчитан в корректный. Давайте посмотрим на примере.

Как вы знаете, даты 35 января не существует. Максимально возможный день января - 31. Получается, что наша дата 35 января имеет 4 лишних дня. JavaScript в таком случае просто прибавит эти лишние 4 дня к следующему месяцу:

let date = new Date(2018, 0, 35); console.log(date); // получится 4 февраля

Можно указывать не только лишние дни, но и месяцы. При этом следует помнить, что месяцы начинаются с нуля, а значит последний корректный месяц - 11-тый. Если указать 12-тый месяц, то получится январь следующего года:

let date = new Date(2018, 12, 1); // указываем 12-тый месяц console.log(date); // получится 1 января 2019 года

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 1, 35); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 15, 1); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 3, 31); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 1, 31); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 12, 33); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 33, 33); console.log(date); // какая дата будет?

Нулевой день

Описанная корректировка работает и в меньшую сторону. Как вы знаете, самым минимальным днем месяца является день с номером 1. Поэтому, если указать день с номером 0, то получится последний день предыдущего месяца:

let date = new Date(2018, 1, 0); // указываем нулевой день console.log(date); // получится 31 января

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 5, 0); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 0, 0); console.log(date); // какая дата будет?

Отрицательные значения

Можно также указывать отрицательные значения дней и месяцев. При этом нужно помнить, что минимальный день имеет номер 1, а минимальный месяц - номер 0. Это значит, что минус первый день попадает во 2 день с конца предыдущего месяца, а минус первый месяц попадает просто в последний месяц предыдущего года:

let date = new Date(2018, 1, -1); // указываем -1 день console.log(date); // получится 30 января
let date = new Date(2018, -1, 1); // указываем -1 месяц console.log(date); // получится 1 декабря 2017 года

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 33, 33); console.log(date); // какая дата будет?

Часы, минуты, секунды

Все сказанное выше аналогично работает с часами, минутами и секундами:

let date = new Date(2018, 0, 1, 24, 0, 0); // указываем 24-тый час console.log(date); // получится 2 января, 0 часов
let date = new Date(2018, 0, 1, 25, 0, 0); // указываем 25-тый час console.log(date); // получится 2 января, 1 час

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 0, 1, 23, 0, 60); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 0, 1, 23, 60, 0); console.log(date); // какая дата будет?

Определите, в какую дату JavaScript преобразует следующий момент времени:

let date = new Date(2018, 0, 1, 100, 100, 100); console.log(date); // какая дата будет?