第一种 硬写(思路:找某一年的一月一日做参考,计算输入的日期到参考日期,间隔的天数,计算输入日期的一号是周几)
// 准备数据
System.out.println("**********欢 迎 使 用 万 年 历***********");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份:");
int year = scanner.nextInt();
if (year < 0) {
System.out.println("年份错误!");
return;
}
System.out.println("请输入月份:");
int month = scanner.nextInt();
if (month > 12 || month < 1) {
System.out.println("月份错误!");
return;
}
int day = 30;// 当月的天数
int day_num = 0;// 从2001年1月到当前月的天数
int yearTest = 2001;// 2001年
int weekTest = 1;// 2001年1月1日周一
int week = 0;// 当前月1号是周几
// 处理数据
// 年份大于2001年
if (year >= yearTest) {
int year_1 = year - yearTest;// 2001年到今年多少年
day_num = year_1 * 365 + year_1 / 4 - year_1 / 100 + year_1 / 400;
// 判断当前月1号离今年1月1号有多少天
for (int i = 1; i <= month; i++) {
if ((i % 2 != 0 && i <= 7) || (i % 2 == 0 && i >= 8)) {
if (i != month)//不算当前月份
day_num += 31;
else
day = 31;
} else if (i == 2) {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
if (i != month)
day_num += 29;
else
day = 29;
} else {
if (i != month)
day_num += 28;
else
day = 28;
}
} else {
if (i != month)
day_num += 30;
else
day = 30;
}
}
week = (day_num + weekTest) % 7;// 当前月1号是周几
} else {
// 年份小于2001
int year_1 = yearTest - year - 1;// 2001年到今年多少年
day_num = year_1 * 365 + year_1 / 4 - year_1 / 100 + year_1 / 400;
if (year_1 % 4 != 0) {
// 闰年年数=year_1/4向上取整(2000年是闰年)
day_num++;
}
// 判断当前月1号离今年1月1号有多少天
for (int i = 12; i >= month; i--) {
if ((i % 2 != 0 && i <= 7) || (i % 2 == 0 && i >= 8)) {
day_num += 31;//当i==month的时候也要加,即算上当前月
day = 31;
} else if (i == 2) {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
day_num += 29;
day = 29;
} else {
day_num += 28;
day = 28;
}
} else {
day_num += 30;
day = 30;
}
}
// 星期从周天往前数
week = (weekTest + 7 - (day_num % 7)) % 7;
}
// 输出数据
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t");
for (int i = 0, j = 1; j <= day; i++) {
if (i < week) {
System.out.print("\t");
} else {
System.out.print(j++ + "\t");
}
if (i % 7 == 6) {
System.out.println();
}
}
第二种方法:借助java.Calendar类,思路不变
System.out.println("请输入日期(例如:2021-06-01):");
Scanner scan = new Scanner(System.in);
Date date = new Date();
Calendar cal = Calendar.getInstance();
try {
// 设置日期字符串格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(scan.next());
} catch (ParseException e) {
System.out.println("输入日期格式有误!");
System.out.println("再皮腿给你打折!!!");
return;
}
cal.setTime(date);// 将日期设置成日历
int day = cal.get(Calendar.DAY_OF_MONTH);// 取出今天是几号
cal.set(Calendar.DAY_OF_MONTH, 1);// 将日期设置为每月的1号,方便计算每月1一号是周几
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
for (int i = 1, j = 1; i <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); j++) {
// i控制输出每月的几号
// j控制每周换行以及正式打印号数之前的空格
// cal.getActualMaximum(Calendar.DAY_OF_MONTH)当前月有多少天
if (j >= cal.get(Calendar.DAY_OF_WEEK)) {
// 当前月一号是周几cal.get(Calendar.DAY_OF_WEEK)
if (i == day) {
// 标记当天
System.out.print("*" + i + "\t");
} else {
System.out.print(i + "\t");
}
i++;
} else {
// 打印空格
System.out.print("\t");
}
// 控制每周换行
if (j % 7 == 0) {
System.out.println();
}
}