Java 选择日历闰年

Java Selection for calendaring leap year

如何java将选择应用到闰年?规则是每 4 年有一个从 0 开始的闰年。我做的布尔值是 leapYear = year % 4 == 0 但是当我输入 leapYear 例如4、带闰年的if语句(三月)输出空行。这是代码:

        public static void main(String[] args) {
// create a scanner
Scanner input = new Scanner(System.in);

//prompt user to enter year and first weekday
System.out.println("Enter a year");
int year = input.nextInt();
System.out.println("Enter first weekday of year e.g.: 0 for Sunday");
int weekDay = input.nextInt();
int i;
int jan = 31;
int feb = 28;
int mar = 31;
int apr = 30;
int may = 31;
int jun = 30;
int jul = 31;
int aug = 31;
int sep = 30;
int oct = 31;
int nov = 30;
int dec = 31;
// leap year
boolean leapYear = year % 4 == 0;
if (leapYear) feb += 1;

System.out.println("January " + year);
System.out.println("________________________________");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");

if (weekDay == 1) System.out.printf("%4s", " ");
if (weekDay == 2) System.out.printf("%8s", " ");
if (weekDay == 3) System.out.printf("%12s", " ");
if (weekDay == 4) System.out.printf("%16s", " ");
if (weekDay == 5) System.out.printf("%20s", " ");
if (weekDay == 6) System.out.printf("%24s", " ");

for (i = 1; i <= jan; i++) {
    System.out.printf("%4d", i);
    if (weekDay == 0 && i % 7 == 0) System.out.println("\n");
    if (weekDay == 1 && (i == 6 || i == 13 || i == 20 || i == 27)) System.out.println("\n");
    if (weekDay == 2 && (i == 5 || i == 12 || i == 19 || i == 26)) System.out.println("\n");
    if (weekDay == 3 && (i == 4 || i == 11 || i == 18 || i == 25)) System.out.println("\n");
    if (weekDay == 4 && (i == 3 || i == 10 || i == 17 || i == 24)) System.out.println("\n");
    if (weekDay == 5 && (i == 2 || i == 9 || i == 16 || i == 23 || i == 30)) System.out.println("\n");
    if (weekDay == 6 && (i == 1 || i == 8 || i == 15 || i == 22 || i == 29)) System.out.println("\n");
    }
System.out.println("\n");
System.out.println("February " + year);
System.out.println("________________________________");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
if (weekDay == 0) System.out.printf("%12s", " ");
if (weekDay == 1) System.out.printf("%16s", " ");
if (weekDay == 2) System.out.printf("%20s", " ");
if (weekDay == 3) System.out.printf("%24s", " ");
if (weekDay == 5) System.out.printf("%4s", " ");
if (weekDay == 6) System.out.printf("%8s", " ");
for (i = 1; i <= feb; i++) {
    System.out.printf("%4d", i);
    if (weekDay == 0 && (i == 4 || i == 11 || i == 18 || i == 25)) System.out.println("\n");
    if (weekDay == 1 && (i == 3 || i == 10 || i == 17 || i == 24)) System.out.println("\n");
    if (weekDay == 2 && (i == 2 || i == 9 || i == 16 || i == 23)) System.out.println("\n");
    if (weekDay == 3 && (i == 1 || i == 8 || i == 15 || i == 22)) System.out.println("\n");
    if (weekDay == 4 && i % 7 == 0) System.out.println("\n");
    if (weekDay == 5 && (i == 6 || i == 13 || i == 20 || i == 27)) System.out.println("\n");
    if (weekDay == 6 && (i == 5 || i == 12 || i == 19 || i == 26)) System.out.println("\n");

}

System.out.println("\n");
System.out.println("March " + year);
System.out.println("________________________________");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");

if (leapYear) {
    if (weekDay == 0) System.out.printf("%4s", " ");
    if (weekDay == 1) System.out.printf("%8s", " ");
    if (weekDay == 2) System.out.printf("%12s", " ");
    if (weekDay == 3) System.out.printf("%16s", " ");
    if (weekDay == 5) System.out.printf("%20s", " ");
    if (weekDay == 6) System.out.printf("%24s", " ");

    for (i = 1; i <= mar; i++) {
        if (weekDay == 6 && (i == 4 || i == 11 || i == 18 || i == 25)) System.out.println("\n");
        if (weekDay == 0 && (i == 3 || i == 10 || i == 17 || i == 24)) System.out.println("\n");
        if (weekDay == 1 &&(i == 2 || i == 9 || i == 16 || i == 23 || i == 30)) System.out.println("\n");
        if (weekDay == 2 &&(i == 1 || i == 8 || i == 15 || i == 22 || i == 29)) System.out.println("\n");
        if (weekDay == 3 && i % 7 == 0) System.out.println("\n");
        if (weekDay == 4 && (i == 6 || i == 13 || i == 20 || i == 27)) System.out.println("\n");
        if (weekDay == 5 && (i == 5 || i == 12 || i == 19 || i == 26)) System.out.println("\n"); 
        }
}
else {
if (weekDay == 0) System.out.printf("%12s", " ");
if (weekDay == 1) System.out.printf("%16s", " ");
if (weekDay == 2) System.out.printf("%20s", " ");
if (weekDay == 3) System.out.printf("%24s", " ");
if (weekDay == 5) System.out.printf("%4s", " ");
if (weekDay == 6) System.out.printf("%8s", " ");

for (i = 1; i <= mar; i++) {
    System.out.printf("%4d", i);
    if (weekDay == 0 && (i == 4 || i == 11 || i == 18 || i == 25)) System.out.println("\n");
    if (weekDay == 1 && (i == 3 || i == 10 || i == 17 || i == 24)) System.out.println("\n");
    if (weekDay == 2 && (i == 2 || i == 9 || i == 16 || i == 23 || i == 30)) System.out.println("\n");
    if (weekDay == 3 && (i == 1 || i == 8 || i == 15 || i == 22 || i == 29)) System.out.println("\n");
    if (weekDay == 4 && i % 7 == 0) System.out.println("\n");
    if (weekDay == 5 && (i == 6 || i == 13 || i == 20 || i == 27)) System.out.println("\n");
    if (weekDay == 6 && (i == 5 || i == 12 || i == 19 || i == 26)) System.out.println("\n");    
}
}

你的代码难以阅读,但你遗漏了System.out.printf("%4d", i);在 if (leapYear) 下的块中。但是,您也将闰年应用于三月...

另一种方法...

import java.util.Scanner;

public class Whosebug_32900399 {

    public static void main(String[] args) 
    {
        Scanner input = new Scanner(System.in);

        try
        {
            System.out.println("Enter a year");
            int year = input.nextInt();

            System.out.println("Enter first weekday of year e.g.: 0 for Sunday");
            int weekDay = input.nextInt();

            for (int month = 1; month <= 12; month++)
            {
                printMonthHeader(month, year);
                weekDay = printDaysOfMonth(month, year, weekDay);
                System.out.println("\n");
            }
        }
        finally
        {
            input.close();
        }
    }

    private static void printMonthHeader(int monthOfYear, int year)
    {       
        String month = "";

        switch (monthOfYear)
        {
            case 1 : month = "January"; break; 
            case 2 : month = "February"; break; 
            case 3 : month = "March"; break; 
            case 4 : month = "April"; break; 
            case 5 : month = "May"; break; 
            case 6 : month = "June"; break; 
            case 7 : month = "July"; break; 
            case 8 : month = "August"; break; 
            case 9 : month = "September"; break; 
            case 10 : month = "October"; break; 
            case 11 : month = "November"; break; 
            case 12 : month = "December"; break; 
        }


        System.out.println(month + " " + year);
        System.out.println("___________________________________");
        System.out.println(" Sun  Mon  Tue  Wed  Thu  Fri  Sat ");
    }

    private static int printDaysOfMonth(int monthOfYear, int year, int startOn)
    {
        int daysInMonth = 0;
        int currentDay = startOn;

        switch(monthOfYear)
        {
            case 4 : 
            case 6 : 
            case 9 : 
            case 11 : 
                daysInMonth = 30;
                break;
            case 2:
                daysInMonth = ((year % 4) == 0 ? 29 : 28);
                break;
            default: 
                daysInMonth = 31;
        }

        StringBuilder buff = new StringBuilder();
        if (currentDay != 0)
        {
            buff.append(String.format("%1$"+(5*startOn)+ "s", ""));
        }

        for (int day = 1; day <= daysInMonth; day ++)
        {
            String padding = day > 9 ? "  " : "   ";
            buff.append(padding + day + " ");

            if (currentDay == 6)
            {
                buff.append("\n");
                currentDay = 0;
            }
            else
            {
                currentDay++;
            }
        }

        System.out.println(buff.toString());
        System.out.println("___________________________________");
        return currentDay;
    }

}