import java.util.Scanner;
public class PrintCalendar {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("Enter full year(eg.2012): ");
int year = input.nextInt();
System.out.print("Enter month as number between 1 and 12: ");
int month = input.nextInt();
printMonth(year,month);
}
public static void printMonth(int year, int month){
printMonthTitle(year,month);
printMonthBody(year,month);
}
public static void printMonthTitle(int year,int month){
String monthName = getMonthName( month);
System.out.println(" "+monthName+" "+year+" ");
System.out.println("----------------------------");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
}
public static void printMonthBody(int year, int month){
int startDay = getStartDay(year, month);
int numberInMonth = getNumberOfDaysInMonth(year,month);
System.out.println("startDays: "+startDay);
for(int i=0;i<startDay;i++)
System.out.print(" ");
for(int i=1;i<=numberInMonth;i++){
System.out.printf("%4d",i);
if((i+startDay)%7==0)
System.out.println();
}
System.out.println();
}
public static String getMonthName(int month){
String monthName = "";
switch (month){
case 1: monthName+="January";break;
case 2: monthName+="February";break;
case 3: monthName+="March";break;
case 4: monthName+="April";break;
case 5: monthName+="May";break;
case 6: monthName+="June";break;
case 7: monthName+="July";break;
case 8: monthName+="August";break;
case 9: monthName+="September";break;
case 10: monthName+="October";break;
case 11: monthName+="November";break;
case 12: monthName+="December";break;
}
return monthName;
}
public static int getStartDay(int year, int month){
final int START_DAY_FOR_JAN_1_1800 = 3;
int toatlNumber = getTotalNumberOfDays(year,month);
System.out.println("totalNumber: "+toatlNumber);
return (toatlNumber + START_DAY_FOR_JAN_1_1800)%7;
}
public static int getTotalNumberOfDays(int year,int month){
int totalNumber = 0;
for (int i=1800;i<year;i++){
if (isLeapYear(year))
totalNumber += 366;
else
totalNumber += 365;
}
for (int j=1;j<month;j++)
totalNumber += getNumberOfDaysInMonth(year,j);
return totalNumber;
}
public static int getNumberOfDaysInMonth(int year,int month){
int numberOfMonth=0;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
numberOfMonth = 31;
if(month==2)
numberOfMonth = isLeapYear(year)?29:28;
if(month==4||month==6||month==9||month==11)
numberOfMonth = 30;
return numberOfMonth;
}
public static boolean isLeapYear(int year){
boolean isLeap = (year%4==0&&year%100!=0)||(year%400==0);
return isLeap;
}
}