// 本程序的功能是输入年和月之后,会在控制台显示当月的日历。是学习java后第一个稍为完整的程序,尚未处理各点的异常。 // java实现,
// 作者: Tome  
// 日期: 2014.3.3


import java.util.*; //需要使用到键盘的输入,所以要引入这个文件 



 // 文件名为sample_calendar, 所以这个类名也被确定为sample_calendar,学java的第一个特别之处 

 public class sample_calendar { 



//定义各月的天数,这里忽略了闰年, 这里要加public static,我自己摸索的,可以用。 

public static int[] monthdays = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 

// 定义星期字符串 

public static String[] weeks = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 

 

// 一个很小的函数,用来确定某年是否是闰年,返回真代码是闰年,反之不是 

private static boolean isRun(int y) 

{ 

if(((y % 4== 0) && (y%100  != 0))|| y % 400 == 0 ) 

{ 

return true; 

} 

return false; 

} 
  

 

// 计算某年某月的第一天是周几, 

// year 年份 

// month 月份 

private static int theFirstDay(int year, int month) 

{ 

// 1900.1.1是周一,因此计划当月第一天与此相距多少天,再对7求模来确定月初是周几 

// 计算这个时间分为两步,先是计划相距多少年,把各年的天数相加。 

int days = 0; 

if (year > 1900) 

{ 

for( int y = 1900; y < year; y++) 

{ 

if (isRun(y)) 

days += 366; 

else 

days += 365; 

} 

} 



// 第二步 计算当年当月之前一共有多少天 

if ( month > 1) 

{ 

for (int m = 1; m < month; m++) 

days += monthdays[m]; 

 

//判断是否闰年 

if (( month > 2) && isRun(year)){ 

days ++; 

} 

} 

// 再加上当日这一天 

days++; 

// 计算出当日是星期几,0代表周日 

int week = days % 7; 

return week; 

} 

 

// 入口程序,与C的main相当 

public static void main(String[] args) 

{ 

// 默认计显示2014  February的月历 

int year = 2014; 

int month = 2; 

 

Scanner in = new Scanner(System.in); 

 

// 输入年份,月份 

System.out.println("Please input years:"); 

year = in.nextInt(); 

System.out.println("Please input months:"); 

month = in.nextInt(); 

 

// 计算月初是周几 

int week = theFirstDay(year, month);  

 

// 计算当月一共有多少天 

int monthDays = monthdays[month]; 

if ( ( month == 2) && isRun(year)) 

monthDays = 29; 

 

// 开始显示日历 

System.out.println("Calendar"); 

System.out.println(year+"年"+month+"月的日历如下:"); 

int loc = 0; 
  //第行最多显示7天,loc用来定位显示位置,0代表行首 

 

System.out.print("\n--------------------------------------------------"); 

// 打印表头,星期日到星期六 

for(int i = 0; i < 7; i++) 

System.out.print(weeks[i] + "\t"); 

System.out.println(); 

 

 

// first line,需要要特别处理一下,月初可能并不是周日,需要确定显示位置 

if ((week != 0) && (true)) 

{ 

for (loc = 0; loc < week; loc ++) 

{ 

System.out.print("\t"); 

} 

} 

// 显示剩下的各天 

for (int data = 1; data <= monthDays; data++) 

{ 

System.out.print(data+"\t"); 

loc++; 

if(loc % 7 == 0) 

System.out.println(); 

} 

 

System.out.print("\n--------------------------------------------------"); 

}//主函数结束 

 }