PrintCalendar

import java.util.Scanner;


public class PrintCalendar {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        System.out.print("Enter a year: ");
        int year = 0;
        while(year < 1800)
            year = input.nextInt();
        
        System.out.print("Enter a month: ");
        int month = 0;
        while(month < 1 || month >12)
            month = input.nextInt();
        
        printCalendar(year, month);
    
    }
    
    static final int MONTH_DAYS[] = {0, 31, 59, 90, 120, 151, 181,
            212, 243, 273, 304, 334, 365};
    
    public static void printCalendar(int year, int month) {
        printMonthTitle(year, month);
        printMonthBody(year, month);
    }
    
    public static void printMonthTitle(int year, int month) {
        System.out.println(" "+year + " " + getMonthName(month));
        System.out.println(" SUN MON TUE WED THU FRI SAT");
        
    }
    
    public static String getMonthName(int month) {
        switch(month) {
        case 1: return "January";
        case 2: return "February";
        case 3: return "March";
        case 4: return "April";
        case 5: return "May";
        case 6: return "June";
        case 7: return "July";
        case 8: return "August";
        case 9: return "September";
        case 10: return "October";
        case 11: return "November";
        default: return "December";
        }
    }
    
    public static void printMonthBody(int year, int month) {
        int startDay = getStartDay(year, month);
        int numberOfDaysInMonth =
                getNumberOfDaysInMonth(year, month);
        for(int i = 0; i < startDay; i++)
            System.out.print("    ");
        for(int i = 0; i < numberOfDaysInMonth; i++) {
            if((i + startDay) % 7 == 0)
                System.out.printf("\n%4s", i + 1);
            else
                System.out.printf("%4s", i + 1);
        }
    }
    
    public static int getStartDay(int year, int month) {
        return
                (getTotalNumberOfDays(year, month) + 3)% 7;
    }
    
    public static int getTotalNumberOfDays(
            int year, int month) {
        int totalNumberOfDays = 0;
        
        for(int i = 1800; i < year; i++) {
            if(isLeapYear(i))
                totalNumberOfDays += 366;
            else totalNumberOfDays += 365;
            }
        totalNumberOfDays += MONTH_DAYS[month - 1];
        
        if(isLeapYear(year) && month > 1)
            return totalNumberOfDays++;
        else return totalNumberOfDays;
    }
    
    public static int getNumberOfDaysInMonth(
            int year, int month) {
        if (isLeapYear(year) == true && month == 2)
            return MONTH_DAYS[month] - MONTH_DAYS[month - 1] + 1;
        else return MONTH_DAYS[month] - MONTH_DAYS[month - 1];    
    }
    
    public static boolean isLeapYear(int year) {
        return year % 400 ==0 || year % 4 ==0 && year % 100 != 0;
    }    
    
}










Enter a year: 2014
Enter a month: 4
 2014 April
 SUN MON TUE WED THU FRI SAT
           1   2   3   4   5
   6   7   8   9  10  11  12
  13  14  15  16  17  18  19
  20  21  22  23  24  25  26
  27  28  29  30