目的:编写方法版的万年历主要是为了熟悉方法的使用,在前面用存分支循环上的一次简单改进。
可参考:Java实现万年历【初级】_Vengo€bs的博客-CSDN博客
代码部分:
import java.util.Scanner;
public class Test08{
/**
知识点:方法版本的万年历
*/
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();//2022
System.out.println("请输入月:");
int month = scan.nextInt();//3
//计算1900年~输入年的总天数
int allDayOfYear = getAllDayOfYear(1900,year);
//计算1月~输入月的总天数
int allDayOfMonth = getAllDayOfMonth(year,1,month);
//计算总天数
int allDay = allDayOfYear + allDayOfMonth + 1;
//计算星期
int week = getWeek(allDay);
//计算当月的天数
int day = getDay(year,month);
//打印日历
printCalendar(year,month,day,week);
}
//计算年的总天数
public static int getAllDayOfYear(int startYear,int endYear){
int allDayOfYear = 0;
for(int i = startYear;i<endYear;i++){
if(isLeapYear(i)){
allDayOfYear += 366;
}else{
allDayOfYear += 365;
}
}
return allDayOfYear;
}
//计算月的总天数
public static int getAllDayOfMonth(int year,int startMonth,int endMonth){
int allDayOfMonth = 0;
for(int i = startMonth;i<endMonth;i++){
allDayOfMonth += getDay(year,i);
}
return allDayOfMonth;
}
//计算当月天数
public static int getDay(int year,int month){
int day = 0;
switch(month){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
day = 31;
break;
case 4:case 6:case 9:case 11:
day = 30;
break;
case 2:
if(isLeapYear(year)){//闰年
day = 29;
}else{//平年
day = 28;
}
break;
}
return day;
}
//判断闰年
public static boolean isLeapYear(int year){
if(year%4==0 && year%100!=0 || year%400==0){
return true;
}
return false;
}
//计算星期
public static int getWeek(int allDay){
int week = allDay%7;
if(week == 0){
week = 7;
}
return week;
}
//打印日历
public static void printCalendar(int year,int month,int day,int week){
System.out.println(" ---" + year + "年" + month + "月--- ");
System.out.println("一\t二\t三\t四\t五\t六\t日");
//打印日期前的空格
int num = 0;//记录是否换行
for(int i = 1;i<week;i++){
System.out.print("\t");
num++;
}
//打印日期的空格
for(int i = 1;i<=day;i++){
num++;
System.out.print(i + "\t");
if(num%7 == 0){
System.out.println();
}
}
}
}
运行结果:
与实际相符