解决思路:首先,确定月份的第一天是星期几。其次,确定这个月有多少天,要注意的是闰年和平年的二月天数是不一样的。闰年(1.年数能被4整除,但不能同时被100整除,2.年数能被400整除(二者符合其一就可),例如:1900能被4整除,但他同时能被100整除,所以他不是闰年;2000虽然能被100整除,但它又能被400整除,所以它是闰年。)的二月有29天,平年的二月有28天。
import java.util.Scanner;
public class PrintCalendar{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.println("Enter a year!");
int year=input.nextInt();
System.out.println("Enter a month!");
int month=input.nextInt();
//打印一个月的日历,如果要打印一年的话,使用循环从第一个月开始就行。
printMonth(year,month);
//关闭接口,养成好习惯
input.close();
}
public static boolean isLeapYear(int year){ //判断是否为闰年
return year%4==0&&year%100!=0||year%400==0;
}
public static int getDaysInMonth(int year,int month){ //计算每个月有多少天
//大月31天,小月30天,二月根据情况
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
return isLeapYear(year)? 29 : 28;
default:
return 30;
}
}
public static String getMonthName(int month){ //获取月份名称,这里采取英文的
if(month>12 || month<1) { //非法输入检测
System.err.println("错误的月份!");
System.exit(0);
}
switch(month){
case 1:return "January";
case 2:return "February";
case 3:return "March";
case 4:return "April";
case 5:return "May";
case 6:return "June";
case 7:return "July";
case 8:return "August";
case 9:return "September";
case 10:return "October";
case 11:return "November";
case 12:return "December";
}
return "";
}
public static int getStartDay(int year,int month){ //计算每一个月的第一天是星期几
//选择1900-1-1作为一个时间点,计算从1900-1-1到输入的年月里过多少天
int daySum=0;
for(int i=1900;i<year;i++)
daySum+=isLeapYear(i)? 366: 365;
for(int i=1;i<month;i++)
daySum+=getDaysInMonth(year,i);
//返回星期几,因为选择的1900-1-1是星期一,所以加一。不同的选择有不同的返回值。
return daySum%7+1;
}
public static void printMonth(int year,int month){ //打印日历
int count=0; //作为计算器
System.err.println("\t"+getMonthName(month)+"\t"+year);
System.out.println("---------------------------------------------");
System.out.println("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
for(int i=0;i<getStartDay(year,month) && getStartDay(year,month)<7;i++){
System.out.print("\t");
count++;
}
for(int i=1;i<=getDaysInMonth(year,month);i++){
System.out.print(i+"\t");
count++;
if(count%7 == 0){ //一行只打印七个,包括空格。七次后换行打印。
System.out.println();
}
}
System.out.println();
System.out.println("---------------------------------------------");
}
}
当然方法不止一种,也可以借用Calendar类来打印日历。
import java.util.Calendar;
import java.util.Scanner;
public class PrintCalendar{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.println("Enter a year!");
int year=input.nextInt();
System.out.println("Enter a month!");
int month=input.nextInt();
//打印一个月的日历,如果要打印一年的话,使用循环从第一个月开始就行。
printMonth(year,month);
//关闭接口,养成好习惯
input.close();
}
public static void printMonth(int year,int month){
printMonthTitle(year,month);
printMonthBody(year,month);
}
public static void printMonthTitle(int year,int month){
System.err.println("\t"+getMonthName(month)+"\t"+year);
System.out.println("---------------------------------------------");
System.out.println("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
}
public static String getMonthName(int month){ //获取月份名称,这里采取英文的
if(month>12 || month<1) { //非法输入检测
System.err.println("错误的月份!");
System.exit(0);
}
switch(month){
case 1:return "January";
case 2:return "February";
case 3:return "March";
case 4:return "April";
case 5:return "May";
case 6:return "June";
case 7:return "July";
case 8:return "August";
case 9:return "September";
case 10:return "October";
case 11:return "November";
case 12:return "December";
}
return "";
}
public static int[] getMonthDays(int year,int month){
int[] days={0,0};
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR,year);
cal.set(Calendar.YEAR,year);
cal.set(Calendar.MONTH,month-1);//月份从0开始
cal.set(Calendar.DAY_OF_MONTH,1);
days[0]=cal.get(Calendar.DAY_OF_WEEK);
cal.roll(Calendar.DAY_OF_MONTH,-1);//最后一天
days[1]=cal.get(Calendar.DAY_OF_MONTH);
return days;
}
public static void printMonthBody(int year,int month){
Calendar cal=Calendar.getInstance();
int[] days=getMonthDays(year,month);
int startDay=days[0]-1;//startDay从1开始,打印要从0开始
int numberOfDaysInMonth=days[1];
int i=0;
for(i=0;i<startDay;i++){
System.out.printf("\t");
}
for(i=1;i<=numberOfDaysInMonth;i++){
System.out.printf("%d\t",i);
if((i+startDay)%7==0)
System.out.println();
}
System.out.println("\n---------------------------------------------");
}
}
如有错误欢迎在评论区指正~