Найти предыдущий високосный год
Какой код нужно написать, чтобы найти предыдущий високосный
год используя конструктор Date или указывая год самому?
Пытался сделать так:
let now = new Date();
let date = new Date(now.getFullYear(), 2, 0);
for (now.getFullYear(), , year--) {
if (date.getDate() == 29) {
console.log("Високосный год!");
}
}
Ответы (5 шт):
Автор решения: Vladimir
→ Ссылка
Для того чтобы проверить сделать проверку високосный год или нет, достаточно проверить на делимость на 4
function getLastLeapYear() {
const year = new Date().getFullYear();
const diff = year % 4;
return year - diff;
}
console.log(getLastLeapYear());
Автор решения: Qwertiy
→ Ссылка
function prevLeapYear(y) {
--y // убрать, если надо <= переданного, а не строго <
y &= ~3
if (y % 100 === 0 && y % 400 !== 0) y -= 4
return y
}
var input = document.querySelector('input')
var output = document.querySelector('output')
output.textContent = prevLeapYear(input.valueAsNumber)
input.addEventListener('input', e => {
output.textContent = e.target.validity.valid
? prevLeapYear(e.target.valueAsNumber)
: "Enter valid year"
})
<input type=number value=2022 required min=1 max=10000> <output></output>
Автор решения: Anatoly
→ Ссылка
В вопросе явно звучит "Как дописать код..." То есть предлагается цикл for, в котором по признаку 29 дней надо выделить високосный год. Пожалуйста:
let now = new Date(); //Получаем текущую дату
let year = now.getFullYear(); //Извлекаем год (четыре знака)
const limit = year - 4; //Високосный год бывает раз в 4 года. 4 года - диапазон поиска
for(year; year > limit; --year) {//Изменяя год в пределах диапазона поиска,
let date = new Date(year, 1, 29);//Подставляем число, присущее високосному году
let currentMonth = date.getMonth();
if(currentMonth == 1) { //Если номер месяца не изменился, значит это - високосный год
console.log('Вот он, високосный год! -- ', year);
} else { //Если номер месяца изменился, проходим к предыдущему году...
console.log('Фига вам, а не високосный год!');
}
}
Используем очень полезную особенность объектов Date - автоисправление. То есть, если задан номер дня больше, чем имеется в месяце, то изменяется номер месяца и номер дня. Кстати, проверка показала, что номера месяцев начинаются с нуля.
Автор решения: mountain123
→ Ссылка
в виде функции
function getPrevLeap(year) {
while (true) {
let date = new Date(year--, 2, 0)
if (date.getDate() === 29){
return date.getFullYear()
}
}
}
console.log(getPrevLeap(2022))
Автор решения: Константин Юдаков
→ Ссылка
let now = new Date();
for (let year = now.getFullYear(); year >= 0; year--) {
let date = new Date(year, 2, 0);
if (date.getDate() == 29) {
console.log(year);
break;
}
}