以2020年5月为例,输出日历如下
简单的思路的分析:
该月有多少天,第一天是星期几;
该年是否为闰年;
因为1990年1月1号为周一,通过输入日期距离它的天数利用余数可以知道当月第一天为周几。
利用代码进行分析
首先导包与控制台的输入
再判断该年是不是闰年,并判断每月的天数
计算从1990年1月1号到该年1月1号的天数和,再计算该年1月1号到本月的天数,将天数和相加;
判断当前月的第一天是周几,可以利用余数来解决
最后输出当前年月的日历,对于在当月第一天之前的用空格代替
完整的代码如下:
package part;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//控制台输入年和月,输出该月的日历
Scanner input = new Scanner(System.in);
int year, month;
System.out.println("请输入年份:");
year = input.nextInt();
System.out.println("请输入月份:");
month = input.nextInt();
//判断该年是不是闰年,及确定每月有多少天
boolean isleap = false;
if((year%4 == 0 && year%100!= 0) || (year%400 == 0)){
isleap = true;
}else{
isleap = false;
}
int monthDays = 0;
switch (month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12: // 大月份
monthDays = 31;
break;
case 4: case 6: case 9: case 11: // 小月份
monthDays = 30;
break; // 2月份
default:
monthDays = isleap? 29:28;
break;
}
//因为1990年一月一号为星期一,按照年份差距计算天数,月份距离本年1月1日有多少天,两部分求和
int yearsum = 0;
int monthsum = 0;
int sum = 0;
// 计算年份相差的天数,当为闰年则为366,否则为365天
for (int i = 1990; i<year;i++){
if ((i%4 == 0 && i%100 != 0) || (i%400 == 0)){
yearsum += 366;
}else{
yearsum += 365;
}
}
// 计算月份距离本年1月1日的天数
for (int i = 1; i < month; i++){
switch (i){
// 大月份
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
monthsum+= 31;
break;
// 小月份
case 4: case 6: case 9: case 11:
monthsum += 30;
break;
// 2月份
default:
monthsum += isleap? 29:28;
break;
}
}
// 两部分之和即相距天数
sum =yearsum + monthsum;
//计算当前月第一天是周几 已知1990年1月1日是周一,根据上一步计算的时间距离求
int week = (sum%7) + 1; // 总天数%7 + 1 除掉所有整星期数后的数字则为星期几
//打印当前月日历
System.out.println("日 一 二 三 四 五 六");
// 打印可能的空白
for (int i = 0;i<week;i++){ //将空白赋值在week前面
System.out.print(" ");
}
// 打印日历
for (int i = 1;i<=monthDays;i++){
System.out.print(i + " ");
if ((i+week)%7 == 0){
System.out.println();
}
}
System.out.println();
}
}