Определить високосный год с помощью Java?

Вот мои требования. Алгоритм определения, является ли год високосным:

  • If the year can be evenly divided by 4, then it is a leap year
    • Except when the year can be evenly divided by 100, then it is not a leap year
  • За исключением случаев, когда год можно разделить на 400 без остатка, тогда это високосный год.
  • В противном случае это не високосный год

Мне нужно знать, правильно ли я поступил?

private static boolean isLeapYear(int userInput){
    boolean leapYear= false;

    if (userInput % 4 == 0 ){
        leapYear = true;

        if (userInput % 4 == 0 && userInput % 100 ==0) {
            leapYear = false;

            if(userInput % 400 == 0){
                leapYear = true;
            }
        }
    }
    else {
        leapYear = false;
    }

    return leapYear;
}

person NilR    schedule 19.10.2012    source источник
comment
Если вы хотите знать, все ли вы сделали правильно, напишите несколько тестов.   -  person Greg Hewgill    schedule 19.10.2012
comment
@ Грег Хьюгилл Я знал, но не знаю, правильный ответ или нет !!! :(   -  person NilR    schedule 19.10.2012
comment
Вот некоторые данные тестового примера: en.wikipedia.org/wiki/List_of_leap_years   -  person Greg Hewgill    schedule 19.10.2012
comment
возможно, представляет интерес, если не повторяющийся вопрос: stackoverflow.com/q/7395699/10468   -  person DarenW    schedule 19.10.2012
comment
на самом деле это то, на что нужно смотреть: stackoverflow.com/q/1021324/10468   -  person DarenW    schedule 19.10.2012
comment
@ Грег Хьюгилл Я уже проверил этот код, но мне нужно было проверить результат :), так что спасибо за вики: D   -  person NilR    schedule 19.10.2012
comment
@Niloo Или вы можете сравнить результаты с результатами класса Java GregorianCalendar.   -  person user1500049    schedule 19.10.2012
comment
Более оптимизированный код: stackoverflow.com/a/11595914/733805   -  person Kevin P. Rice    schedule 30.01.2013


Ответы (9)


userInput % 4 == 0 && userInput % 100 ==0 эквивалентно userInput % 400 == 0

и userInput % 4 == 0, то это определенно високосный год, поэтому нет необходимости проверять какие-либо другие условия.

person Tribhuwan    schedule 19.10.2012
comment
На самом деле это эквивалентно userInput % 100 == 0 - person DarenW; 19.10.2012
comment
Я имею в виду 4 * 100 = 400, что равно userInput % 4 == 0 && userInput % 100 ==0. - person Tribhuwan; 19.10.2012
comment
@Tribhuwan DarenW прав. Ваш ответ неверен. - person David K; 26.03.2015

Я использовал это в C++.

return ((userInput % 400) || ((userInput % 4) && !(userInput % 100)));

person Vector808    schedule 25.03.2015
comment
Тест на 400 эффективнее ставить последним. См. stackoverflow.com/a/11595914/3466415. - person David K; 26.03.2015

Лучше использовать это условие для допустимого високосного года
(((year%4 == 0) && (year%100 !=0)) || (year%400==0))

Вот аналогичная программа на C для проверки високосного года< /а>.

person Pankaj Prakash    schedule 24.05.2015

Правильный! Упрощенный:

  1. Удалите year % 4 из 2-го if до н.э., уже протестированного в 1-м if
  2. Удалите else до н.э., уже установив leap = False вверху

Питон:

def is_leap(year):
    leap = False

    if year % 4 == 0:
        leap = True

        if year % 100 == 0:
            leap = False

            if year % 400 == 0:
                leap = True

    return leap

1-строчный:

def is_leap(year):
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
person JBallin    schedule 15.08.2016

Я использовал этот короткий метод:

private static Boolean isLeapYear(int year) {
        return year % 4 == 0 ? (year % 100 == 0 ? ( year % 400 == 0 ? true : false) : true) : false ;
    }
person Ravindra    schedule 29.05.2017

С 1700 по 1917 год официальным календарем был юлианский календарь. С тех пор мы используем григорианскую календарную систему. Переход от юлианской календарной системы к григорианской произошел в 1918 году, когда следующим днем ​​после 31 января было 14 февраля. Это означает, что 32-й день 1918 года был 14 февраля.

В обеих календарных системах февраль - единственный месяц с переменным количеством дней, в нем 29 дней в високосный год и 28 дней во все остальные годы. В юлианском календаре високосные годы делятся на 4, а в григорианском календаре високосные годы бывают одним из следующих:

Делится на 400.

Делится на 4 и не делится на 100.

Таким образом, программа для високосного года будет:

def leap_notleap(year):

    yr = ''
    if year <= 1917:
        if year % 4 == 0:
            yr = 'leap'
        else:
            yr = 'not leap'
    elif year >= 1919:
        if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):
            yr = 'leap'
        else:
            yr = 'not leap'
    else:
        yr = 'none actually, since feb had only 14 days'

    return yr
person Sanket Mathur    schedule 01.10.2019

С python и другими языками вы можете использовать свойство: если вычесть 1 день из марша, у вас будет последний день февраля. Если год високосный, то этот день 29.

from datetime import datetime, timedelta

def is_leap_year(year: int):
    marzo = datetime(year, 3, 1)
    febrero = marzo - timedelta(1)
    if febrero.day == 29:
        return True
    else:
        return False
person DAVID ALEJANDRO PINEDA    schedule 18.03.2021

Каждый год, который точно делится на четыре, является високосным, за исключением годов, которые точно делятся на 100, но эти столетние годы являются високосными, если они точно делятся на 400. Например, 1700, 1800 и 1900 годы являются високосными. не високосные годы, а 1600 и 2000 годы.[2]

—  Военно-морская обсерватория США

Источник: https://en.wikipedia.org/wiki/Gregorian_calendar

Таким образом, чтобы год считался високосным, он должен быть:

  1. Либо делится на 400 -ИЛИ-
  2. Делится на 4, но не на 100

Используйте этот факт в своем коде следующим образом:

if((userInput % 400 == 0) || (userInput % 4 == 0 && userInput % 100 != 0)) {
     System.out.println(userInput + " is a leap year");
}

Для производственного кода я рекомендую использовать OOTB java.time API:

if (java.time.Year.isLeap(userInput)) {
    System.out.println(userInput + " is a leap year");
}

Узнайте больше о современном API даты и времени из Trail: Date Time< /а>.

person Arvind Kumar Avinash    schedule 18.03.2021
comment
Не знал об этом методе OOTB - person anubhava; 19.03.2021

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person adiga; 05.04.2019