程序是基于1800年为基准的,已知1800年1月1日是星期三
思路很简单 就是就算出要打印年份的月份之前距离1800年1月1日的总天数,然后对7取余,加上3就是要打印月份第一天的星期几。
然后for循环输出那个月份的天数(七天一个周期)
总天数=年份天数+月份天数
注意这里有闰年的存在 在闰年一年是366天的,否则就是365天
同时闰年的2月份是29天的 其他就是28天
判断是否闰年的条件是: year%400==0||(year%4==0&&year%100!=0) 满足其中之一就是闰年
以下是代码
package 打印日历;
import java.util.Scanner;
public class PrintCalendar {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.println("本宝宝可以帮你打印你想要的日历哦!请输入你想打印的年份:");
int year=input.nextInt();
System.out.println("请输入你想打印的月份:");
int month=input.nextInt();
PrintMonth(year,month);//输出日历
System.out.println("\n\t打印成功!嘿嘿嘿");
input.close();
}
public static void PrintMonth(int year,int month){
System.out.println(" "+getMonthName(month)+" "+year);
System.out.println("*****************************");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat ");
//以上是打印月份的前头部分
printMonthBody(year,month);//打印月份主体
}
//得到月份返回
public static String getMonthName(int month){
String monthname=" ";
switch(month){
case 1:monthname="January";break;
case 2:monthname="Febuary";break;
case 3:monthname="March";break;
case 4:monthname="April";break;
case 5:monthname="May";break;
case 6:monthname="June";break;
case 7:monthname="July";break;
case 8:monthname="August";break;
case 9:monthname="September";break;
case 10:monthname="October";break;
case 11:monthname="November";break;
case 12:monthname="December";
}
return monthname;
}
//打印月份主体
public static void printMonthBody(int year,int month){
int starday=getStarDay(year,month);//得到要打印月份的第一天是星期几
for(int i=0;i<=starday;i++){
System.out.printf(" ");
}
for(int i=1;i<=numberOfMonth(month,year);i++){
System.out.printf("%4d",i);//输出打印月份的天数
if((i+starday)%7==0)//七天一个星期 换行
System.out.println();
}
}
public static int getStarDay(int year,int month){
int total=0; //先设总共距离1800年1月1日天数为0
for(int i=1800;i<year;i++){
if(isLeapyear(i)) total=total+366; //如果是闰年的话就加366天
else total=total+365; //不是闰年就加365天
} //得到要打印年份距离1800年的天数
for(int i=1;i<month;i++){
total=total+numberOfMonth(i,year);
} //得到要打印年份的要打印月份之前月份的总共天数
int starday=(total+3)%7;//七天一个循环,加上3是因为1800年1月1日是星期三
return starday;//返回要输出月份的第一天是星期几
}
//月份天数的不同
public static int numberOfMonth(int month,int year){
if (month==1||month==3||month==5||month==7||month==8||month==10
||month==12)
return 31;
else if(month==2){
if(isLeapyear(year))
return 29;
else return 28;
}
else return 30;
}
//判断是否是闰年
public static boolean isLeapyear(int year){
return year%400==0||(year%4==0&&year%100!=0);
}
}