在大二学习java语言时,有一个作业是写一个打印日历的java程序。当时我的代码并不完善,因为要考虑到平年闰年、每月天数等问题。现在看来这是一个很简单的java编程问题,只要把其中的关系搞清楚,做成一个个函数调用。现修改代码如下,运行结果如图所示。代码内含注释,结构清晰,函数调用环环相扣,逻辑性强。
//8.6显示日历;程序清单5-12
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 (e.g.,2001):");
		int year = input.nextInt();//输入并定义年份
		
		System.out.print("Enter month in number between 1 and 12:");
		int month = input.nextInt();//输入并定义月份
		printMonth(year,month);
		input.close();//打印日历并关闭输入函数
	}
	//打印函数,分为表头和内容部分
	public static void printMonth(int year,int month){
		printMonthTitle(year,month);
		printMonthBody(year,month);
	}
	//打印表头函数
	public static void printMonthTitle(int year, int month){
		System.out.println("         "+getMonthName(month)+" "+year);
		System.out.println("---------------------------" +
				"-------------------------");
		System.out.println("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
	}
	//转译函数,把数字月份转换成英文月份
	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";
		}
		return monthName;
	}
	//打印日历内容函数
	public static void printMonthBody(int year,int month){
		int startDay = getStartDay(year, month);
		int numberOfDaysInMonth = getNumberOfDaysInMonth(year,month);
		int  i=0;
		for(i=0;i<startDay;i++)
			System.out.print("\t");
		for(i = 1;i <= numberOfDaysInMonth;i ++){
			System.out.print(i + "\t");
			if((i+startDay)%7 == 0)
				System.out.println();
		}
		System.out.println();
	}
	//设置起始日期1800/01/01为星期三
	public static int getStartDay(int year,int month){
		final int START_DAY_FOR_JAN_1_1800 = 3;
		int totalNumberOfDays = getTotalNumberOfDays(year,month);
		return(totalNumberOfDays + START_DAY_FOR_JAN_1_1800)%7;
	}
	//计算从1800/01/01至目标日期天数
	public static int getTotalNumberOfDays(int year,int month){
		int total = 0;
		for(int i=1800;i<year;i++)
			if(isLeapYear(i))
				total = total+366;
			else
				total = total +365;
			for(int i = 1;i < month;i++)
				total = total + getNumberOfDaysInMonth(year,i);
			return total;
		}
	//定义每月天数
	public static int getNumberOfDaysInMonth(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)return isLeapYear(year)?29:28;
		return 0;
	}
	//判断平年闰年
	public static boolean isLeapYear(int year){
		return year%400 == 0||(year%4 == 0 && year%100 != 0);
	}
}