// 本程序的功能是输入年和月之后,会在控制台显示当月的日历。是学习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--------------------------------------------------");
}//主函数结束
}