Java-код для вычисления високосного года
Я слежу за книгой "Искусство и наука Java", и в ней показано, как рассчитать високосный год. В книге используется библиотека ACM Java Task Force.
Вот код, который используется в книгах:
import acm.program.*;public class LeapYear extends ConsoleProgram { public void run() { println("This program calculates leap year."); int year = readInt("Enter the year: "); boolean isLeapYear = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)); if (isLeapYear) { println(year + " is a leap year."); } else println(year + " is not a leap year."); }}
Итак, вот как я рассчитал високосный год.
import acm.program.*;public class LeapYear extends ConsoleProgram { public void run() { println("This program calculates leap year."); int year = readInt("Enter the year: "); if ((year % 4 == 0) && year % 100 != 0) { println(year + " is a leap year."); } else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) { println(year + " is a leap year."); } else { println(year + " is not a leap year."); } }}
Что - то не так с моим кодом или мне следует использовать тот, который предоставлен в книге?
РЕДАКТИРОВАТЬ :: Оба приведенных выше кода работают нормально, я хочу спросить, какой код является лучшим способом вычисления високосного года.
Переведено автоматически
Ответ 1
Правильная реализация:
public static boolean isLeapYear(int year) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365;}
Но если вы собираетесь изобретать это колесо заново, то:
public static boolean isLeapYear(int year) { if (year % 4 != 0) { return false; } else if (year % 400 == 0) { return true; } else if (year % 100 == 0) { return false; } else { return true; }}
Ответ 2
java.time.Year::isLeap
Я хотел бы добавить новый java.time способ сделать это с помощью Year класса и isLeap метода:
java.time
Year
isLeap
java.time.Year.of(year).isLeap();
Ответ 3
Я предлагаю вам поместить этот код в метод и создать модульный тест.
public static boolean isLeapYear(int year) { assert year >= 1583; // not valid before this date. return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);}
В модульном тестировании
assertTrue(isLeapYear(2000));assertTrue(isLeapYear(1904));assertFalse(isLeapYear(1900));assertFalse(isLeapYear(1901));
Ответ 4
new GregorianCalendar().isLeapYear(year);