一.功能
根据用户输入的年份和月份,在控制台打印出对应月份的日历。
二.算法讲解
要打印一个月的日历只需要知道两件事。
1.这个月第一天是星期几
本例子中,使用蔡勒公式,判断某年某月的一号是周几,关于蔡勒公式不了解的同学可以百度一下,这里不作讲解。
使用"蔡勒公式"计算某月第一天是周几的好处有:
(1).不用选择参考年月日;
(2)不用计算参考日到计算日的间隔天数;
(3)不用计算一年有多少天。
2.这个月有多少天
使用switch-case语句进行判断,大月31天,小月30天,2月闰年29天,平年28天。
三.源码
import java.util.Scanner;
public class DateUtils {
/* 判断是否为闰年 */
public boolean isleap(int year) {
return (year % 4 == 0) && (year % 100 != 0) || year % 400 == 0;
}
/* 判断这个月有多少天 */
public int daysOfmonth(int year, int month) {
switch (month) {
/* 大月 */
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
/* 小月 */
case 4:
case 6:
case 9:
case 11:
return 30;
/* 二月 */
case 2:
if (isleap(year))
return 29;
else
return 28;
default:
System.out.println("程序错误:输入的月份有误!");
return 0;
}
}
/**
* 蔡勒公式,判断某年某月的一号是周几
*
* @param year 年
* @param month 月
* @return week(0,6)
*/
private int weekOffirst(int year, int month) {
int m = month;
int d = 1;
if (month <= 2) { /* 对小于2的月份进行修正 */
year--;
m = month + 12;
}
int y = year % 100;
int c = year / 100;// 世纪数减1
int w = (y + y / 4 + c / 4 - 2 * c + (13 * (m + 1) / 5) + d - 1) % 7;
if (w < 0) /* 修正计算结果是负数的情况 */
w += 7;
return w;
}
/* 打印日历 */
public void dataprint(int year, int month) {
System.out.println("\t\t" + year + "年" + " " + month + "月");
System.out.println("日\t一\t二\t三\t四\t五\t六");
int week = weekOffirst(year, month);
int[][] data = new int[6][7];
int daynum = 1;
for (int i = 0; daynum <= daysOfmonth(year, month); i++) {
for (int j = 0; j < 7 && daynum <= daysOfmonth(year, month); j++) {
if (i == 0 && j < week) {
data[i][j] = 0;
System.out.print("\t");
} else {
data[i][j] = daynum++;
System.out.print(data[i][j] + "\t");
}
}
System.out.println();
}
}
/* 主函数入口 */
public static void main(String[] args) {
DateUtils du = new DateUtils();
Scanner scn = new Scanner(System.in);
System.out.print("输入要打印的年:");
int year = scn.nextInt();
System.out.print("输入要打印的月:");
int month = scn.nextInt();
scn.close();
du.dataprint(year, month);
}
}