aSimleCalender

Nov112006

/*
* Main.java
*
* Created on 2006年11月4日, 下午1:27
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package javaapplication1;

/**
*
* @author Karpar
*/
import java.io.*;

public class PrintCalender {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
InputStreamReader stdin = new InputStreamReader(System.in);
BufferedReader console = new BufferedReader(stdin);
int year = 0,month = 0;
String s1,s2;
try
{ System.out.print ("Enter full year:");
s1 = console.readLine();
year = Integer.parseInt(s1);
System.out.print ("Enter month in number between 1 and 12:");
s2 = console.readLine();
month = Integer.parseInt(s2);
}
catch(IOException ioex)
{
System.out.println("Input error");
System.exit(1);
}
catch(NumberFormatException nfex)
{
System.out.println("\"" + nfex.getMessage() + "\" is not numeric");
System.exit(1);
}
//Print calender for the month of the year.
printMonth (year, month);
}

//Print the Calender for a month in a year
static void printMonth (int year, int month)
{
//Get start day of the week for the first date in the month
int startDay = getStartDay (year , month);
//Get number of days in the month
int numOfDaysInMonth = getNumOfDaysInMonth(year, month);
//print headings
printMonthTitle (year, month);
//Print body
printMonthBody (startDay ,numOfDaysInMonth);

}
//Get the start day of the first day in a month
static int getStartDay(int year , int month)
{
//Get total number of days since 1/1/1800
int startDay1800 = 3;
long totalNumOfDays = getTotalNumOfDays(year ,month);
//Return the start day
return (int)((totalNumOfDays + startDay1800) % 7);
}
//Get the total number of days since Jan 1,1800
static long getTotalNumOfDays(int year,int month)
{
long total = 0;
//Get the total days from 1800 to year -1;
for (int i = 1800 ;i <>
if(isLeapYear (i))
total = total + 366;
else
total = total + 365;
//Add day from Jan to The month prior to the calender
for (int i = 0; i <>
total = total + getNumOfDaysInMonth(year,i);
return total;

}
//Get the number of days in a month
static int getNumOfDaysInMonth(int year ,int month)
{
if (month == 1 || month == 3 || month == 5 || month == 7
|| month == 8 || month == 10 || month == 12)
return 31;
if (month == 4 || month == 6 || month == 9 || month ==11)
return 30;
if (month == 2)
if(isLeapYear(year))
return 29;
else
return 28;
return 0;
}
//Determine if it is a leap year
static boolean isLeapYear (int year)
{
if((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
return true;
return false;
}
//Print month body
static void printMonthBody(int startDay,int numOfDaysInMonth)
{
//Pad space before the first day of the month
int i = 0;
for(i=0; i <>
System.out.print(" ");
for (i = 1 ;i <= numOfDaysInMonth ; i++){
if(i <>
System.out.print(" " + i);
else
System.out.print(" " + i);
if((i + startDay) % 7 == 0)
System.out.println();

}
System.out.println();

}
//Print the month title,i.e. May, 1999
static void printMonthTitle(int year,int month)
{
System.out.println(" " + getMonthName(month)
+ " , " + year);
System.out.println("-------------------------------------");
System.out.println(" Sun Mon Wed Thu Fri Sat");
}
//Get the entire name for the month
static String getMonthName(int month)
{
String monthName = null;
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;
}
}