- Программа JavaScript для проверки високосного года
- Пример 1. Проверка високосного года с помощью if… else
- Пример 2: Проверка високосного года с помощью newDate ()
- Найти предыдущий високосный год
- 5 ответов 5
- JavaScript: проверьте, является ли данный год високосным в григорианском календаре
- JavaScript, чтобы найти високосный год
- 8 ответов
Программа JavaScript для проверки високосного года
В этом примере вы научитесь писать программу на JavaScript, которая будет проверять, является ли год високосным или нет.
Чтобы понять этот пример, вы должны знать следующие темы программирования JavaScript:
Год считается високосным, если выполняются следующие условия:
Пример 1. Проверка високосного года с помощью if… else
// program to check leap year function checkLeapYear(year) ( //three conditions to find out the leap year if ((0 == year % 4) && (0 != year % 100) || (0 == year % 400)) ( console.log(year + ' is a leap year'); ) else ( console.log(year + ' is not a leap year'); ) ) // take input const year = prompt('Enter a year:'); checkLeapYear(year);
Введите год: 2000 2000 - високосный год.
В приведенной выше программе проверяются три условия, чтобы определить, является ли год високосным или нет.
% Оператор возвращает остаток от деления.
Пример 2: Проверка високосного года с помощью newDate ()
// program to check leap year function checkLeapYear(year) ( const leap = new Date(year, 1, 29).getDate() === 29; if (leap) ( console.log(year + ' is a leap year'); ) else ( console.log(year + ' is not a leap year'); ) ) // take input const year = prompt('Enter a year:'); checkLeapYear(year);
Введите год: 2000 2000 - високосный год.
В приведенной выше программе февраль проверяется, содержит ли он 29 дней.
Если в феврале месяце 29 дней, это будет високосный год.
Предоставляет new Date(2000, 1, 29) дату и время в соответствии с указанными аргументами.
Вт 29 фев 2000 00:00:00 GMT + 0545 (+0545)
getDate() Метод возвращает день месяца.
Найти предыдущий високосный год
Какой код нужно написать, чтобы найти предыдущий високосный год используя конструктор Date или указывая год самому? Пытался сделать так:
let now = new Date(); let date = new Date(now.getFullYear(), 2, 0); for (now.getFullYear(), , year--) < if (date.getDate() == 29) < console.log("Високосный год!"); >>
5 ответов 5
function prevLeapYear(y) < --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" >)
@Demon__, округлить вниз до кратного 4. Вот так: 3 = 0b0. 0011 , а ~3 = 0b1. 1100 = -4 . Применение & ~3 потрёт 2 младших бита (предварительно число будет сконвертировано в signed int32).
Я никак не могу понять к чему это условие на 4 строке. Получается что для 3000 года високосным будет 2996, а следующий високосный уже 3004 (Спустя 8 лет).
function getPrevLeap(year) < while (true) < let date = new Date(year--, 2, 0) if (date.getDate() === 29)< return date.getFullYear() >> > console.log(getPrevLeap(2022))
пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав править
Для того чтобы проверить сделать проверку високосный год или нет, достаточно проверить на делимость на 4
function getLastLeapYear() < const year = new Date().getFullYear(); const diff = year % 4; return year - diff; >console.log(getLastLeapYear());
@Qwertiy зачем проверять делимость на 100? При каких обстоятельствах это может пригодиться? явно лишняя проверка
@Vladimir, For example, in the Gregorian calendar, each leap year has 366 days instead of 365, by extending February to 29 days rather than the common 28. These extra days occur in each year which is an integer multiple of 4 (except for years evenly divisible by 100, but not by 400). The leap year of 366 days has 52 weeks and two days, hence the year following a leap year will start later by two days of the week.
В вопросе явно звучит «Как дописать код. » То есть предлагается цикл 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 — автоисправление. То есть, если задан номер дня больше, чем имеется в месяце, то изменяется номер месяца и номер дня. Кстати, проверка показала, что номера месяцев начинаются с нуля.
Во-первых, не 4 года, а иногда 8. Во-вторых, надо использовать break, а не условие. Ну или всю проверку в условие поместить. И зачем в предусловии цикла мусор?
Уважаемый Qwertiy, в вопросе явно указано, что надо отыскать предыдущий високосный год. А 1900 и 2100, которые должны бы были стать високосными, но не стали, достаточно удалены от нас. То есть ваше «во-первых» несколько не к месту. По поводу вашего «во-вторых» я просто растерялся. Ведь в предлагаемом решении я пишу «В вопросе явно звучит «Как дописать код. » То есть предлагается цикл for, в котором по признаку 29 дней надо выделить високосный год». Вопрос задал явно начинающий. Я — тоже только 10 часов как подключился к Stackoverflow. Это — мой вариант. Плохо?Предложите автору вопроса свой.
Ну так что мешает улучшить до нормального варианта, который проще и 1900/2100 учитывает? Ну и то, что автор использует его только для текущей даты (если это вообще так) вовсе не означает, что все остальные, попавшие сюда из гугла — тоже. А вдруг его программа доживёт до 2100?
Вот, я из твоего кода выкинул несколько лишних мест и добавил break — всё работает верно для любых лет: let now = new Date(); let year = now.getFullYear(); for(; ; —year) < let date = new Date(year, 1, 29); let currentMonth = date.getMonth(); if(currentMonth == 1) < console.log('Вот он, високосный год! -- ', year); break; >else < console.log('Фига вам, а не високосный год!'); >> Кроме момента, что если текущий год високосный, то он и будет получен.
Хотя я бы его ещё сократил до такого: let now = new Date(); let year = now.getFullYear(); for (; ; —year) < if (new Date(year, 1, 29).getMonth() == 1) < break; >> console.log(year)
JavaScript: проверьте, является ли данный год високосным в григорианском календаре
Напишите программу на JavaScript, чтобы определить, является ли данный год високосным в григорианском календаре.
Иллюстрированная презентация:
Пример решения:
Код JavaScript:
function leapyear(year) < return (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0); >console.log(leapyear(2016)); console.log(leapyear(2000)); console.log(leapyear(1700)); console.log(leapyear(1800)); console.log(leapyear(100));
правда правда ложный ложный ложный
Високосный год — это год, содержащий один дополнительный день, добавленный для синхронизации календарного года с астрономическим или сезонным годом. Поскольку сезоны и астрономические события не повторяются в течение целого числа дней, календари с одинаковым числом дней в каждом году с течением времени смещаются относительно события, которое должен отслеживать год. Вставив дополнительный день или месяц в год, дрейф можно исправить. Год, который не является високосным, называется общим годом.
Каждый год, который делится ровно на четыре, является високосным, за исключением лет, которые делятся ровно на 100, но эти столетние годы являются високосными, если они делятся на 400. Например, 1700, 1800 и 1900 годы не високосные годы, но 2000 год.
Чтобы определить, является ли год високосным, выполните следующие действия:
Шаг 1: Если год делится на 4 равномерно, перейдите к шагу 2. В противном случае перейдите к шагу 5.
Шаг 2: Если год делится на 100 равномерно, перейдите к шагу 3. В противном случае перейдите к шагу 4.
Шаг 3: Если год делится на 400 равномерно, перейдите к шагу 4. В противном случае перейдите к шагу 5.
Шаг 4: Год является високосным (366 дней).
Шаг 5: Год не високосный (у него 365 дней).
Блок — схема:
function leapyear(year) < return year % 100 === 0 ? year % 400 === 0 : year % 4 === 0; >console.log(leapyear(2016)); console.log(leapyear(2000)); console.log(leapyear(1700)); console.log(leapyear(1800)); console.log(leapyear(100));
Демонстрация в реальном времени:
Улучшите этот пример решения и опубликуйте свой код через Disqus
Каков уровень сложности этого упражнения?
JavaScript, чтобы найти високосный год
Как я могу получить код ниже, чтобы работать, когда у меня есть месяц февраля? В настоящее время он достигает дня, а затем останавливается, прежде чем попасть в if, чтобы определить, является ли это високосным годом.
if (month == 2) < if (day == 29) < if (year % 4 != 0 || year % 100 == 0 && year % 400 != 0) < field.focus(); field.value = month +'/' + ''; >> else if (day > 28) < field.focus(); field.value = month +'/' + ''; >>
он никогда не вычисляет год, чтобы увидеть, является ли он високосным, он идет прямо к field.focus и field.value, является ли это високосным годом или нет
Ваши условия выглядят немного странно — так как они в настоящее время написаны, вы проверяете только day для значений 29 или больше (на основе предложений day == 29 и day > 28 if). Я предполагаю, что вы намеревались написать day
Возможно, вам придется показать некоторые из окружающего кода для того, как эти переменные устанавливаются. Если вы вообще используете объект Date, помните, что он использует нулевые месяцы.
8 ответов
Безопаснее использовать Объекты Date для данных datetime, например.
isLeap = new Date(year, 1, 29).getMonth() == 1
Поскольку люди постоянно спрашивают, как именно это работает, это связано с тем, как JS вычисляет значение даты из года-месяца-дня (подробности здесь). В основном, он сначала вычисляет первый месяц, а затем добавляет к нему N -1 дней. Поэтому, когда мы просим 29 февраля в не-високосный год, результат будет 1 февраля + 28 дней = 1 марта:
В високосный год, первый + 28 = 29 февраля:
В приведенном выше коде я установил дату 29 февраля и посмотрю, произошел ли перекат. Если нет (месяц остается 1, т.е. Февраль), это високосный год, в противном случае — не-прыжок.
Используйте только для сценариев с малой громкостью, поскольку это примерно в 100 раз медленнее, чем при использовании чего-то вроде isLeap = !((yr % 4) || (!(yr % 100) && (yr % 400))); jsperf.com/ily/7
@RymanHolmes Месяцы в JavaScript-объекте Date индексируются нулем. В високосный год допустим 29-й день 1-го месяца (февраль), поэтому getMonth() возвращает 1 (февраль). В не високосный год JavaScript «корректирует» 29 февраля и 1 марта, поэтому getMonth() вернет 2 (март).
По сравнению с использованием new Date() это примерно в 100 раз быстрее!
Эта последняя версия использует битовый тест младших 3 битов (это кратно 4), а также проверку года, кратного 16 (младшие 4 бита в двоичном виде — 15) и кратного 25.
Это немного быстрее, чем моя предыдущая версия (ниже):
Это также на 5% быстрее по сравнению с уже быстрой версией условного оператора от broc.seib
Ожидаемые результаты логического теста:
alert(ily(1900)); // false alert(ily(2000)); // true alert(ily(2001)); // false alert(ily(2002)); // false alert(ily(2003)); // false alert(ily(2004)); // true alert(ily(2100)); // false alert(ily(2400)); // true
Правильно и быстро:
Если вы находитесь в цикле или считаете наносекунды, это на две величины быстрее, чем ваш год через новый объект Date(). Сравните производительность здесь: http://jsperf.com/ily
Поскольку это просто сочетание логических сравнений с логическими результатами, вы можете выразить это без условных операторов, а только с &&, || и с коротким замыканием. Также примерно на 5% быстрее: jsperf.com/ily/6
isLeap = !(new Date(year, 1, 29).getMonth()-1)
. вычитание на один должно работать даже быстрее, чем сравнивать на большинстве архитектур процессора.
Если бы вам потребовалось вычислять 1000 секунд из них в секунду, я мог бы согласиться с тем, что удобочитаемость должна превосходить скорость, когда разность скоростей между ними практически ничтожна.
Просто запустил некоторые тесты скорости и new Date примерно в 100 раз медленнее, чем с использованием логической логики (скажем, что-то вроде !((yr % 4) || (!(yr % 100) && (yr % 400))) ). Вы могли бы сказать, что я выкинул читабельность из окна ради скорости, но 100 раз может стоить 🙂
Лучшее историческое вычисление високосных лет.
В приведенном ниже коде следует учитывать, что високосные годы были введены в 45BC с юлианским календарем и что большинство западного мира приняли григорианский календарь в 1582 году и что 0CE = 1BC.
isLeap = function(yr) < if (yr >1582) return !((yr % 4) || (!(yr % 100) && (yr % 400))); if (yr >= 0) return !(yr % 4); if (yr >= -45) return !((yr + 1) % 4); return false; >;
Великобритания и ее колонии приняли григорианский календарь в 1752 году, поэтому, если вы более ориентированы на англо-американскую, эта версия будет лучше (мы предположим, что Британия приняла юлианский календарь с римским завоеванием, начиная с 43 года).
isLeap = function(yr) < if (yr >1752) return !((yr % 4) || (!(yr % 100) && (yr % 400))); if (yr >= 43) return !(yr % 4); return false; >;