思路:
1、算出当前月份的第一天与1900/1/1 的天数之差 day
2、将day%7得到当前月的第一天是星期几
3、循环打印日历
代码实现:
import java.util.Calendar;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//1.万年历
//实例化两个日历对象,一个设置为1900/1/1 一个设置为你要查询的日期
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
//年、月
int year,month;
System.out.print("请输入年、月:");
year = input.nextInt();
month = input.nextInt();
//分别设置两个日历的年份和月份
calendar1.set(year,month,1);
calendar2.set(1900,1,1);
//月份从0开始,所以要得到实际月份就需要月份-1
calendar1.set(Calendar.MONTH,month-1);
int day = getDaysBetween(calendar1,calendar2);
//将天数差%7得到当前月份第一天是星期几
day %= 7;
System.out.println("一\t二\t三\t四\t五\t六\t日");
//如果day%7==0,表示当前月份第一天是星期日
if(day == 0)
day=7;
//输出day-1个\t
for(int i = 1; i < day; i++){
System.out.print("\t");
}
//getActualMaximum 获得该月份中天数的最大值
for(int i = 1; i <= calendar1.getActualMaximum(Calendar.DAY_OF_MONTH); i++){
System.out.print(i + "\t");
if((i+day-1)%7 == 0) //当 (i+day-1)%7 == 0 时,表示当天为星期日,需要换行
System.out.println();
}
}
/**
* 获得两个日期间天数差
* @param day1 日期1 用户查询日期
* @param day2 日期2 1900/1/1
* @return 天数差
*/
public static int getDaysBetween(Calendar day1,Calendar day2){
//得到当前月份的第一天在一年中的天数
int days = day1.get(Calendar.DAY_OF_YEAR);
//获得用户输入的年份
int y1 = day1.get(Calendar.YEAR);
//计算1900/1/1日 与 y1/1/1日的天数差
if(day2.get(Calendar.YEAR) != y1){
day2 = (Calendar)day2.clone();
do{
days += day2.getActualMaximum(Calendar.DAY_OF_YEAR);
day2.add(Calendar.YEAR, 1);
}while(day2.get(Calendar.YEAR) != y1);
}
return days;
}
}