# Автоматическая корректировка дат в 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 года`

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

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

Можно также указывать отрицательные значения дней и месяцев. При этом нужно помнить, что минимальный день имеет номер `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 года`

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

`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, 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); // какая дата будет?`

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

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

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

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

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

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

Определите, в какую дату 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); // какая дата будет?`
←→
↑
en ru