求指定日期是星期几,
首先已知1900年一月一日 星期一,求上个月最后一天是星期几。
即计算指定提起距离1900年1月1日 余7得出是星期几
//可以先用固定的日期,以2021年4月为例,也可以增加从控制台输入
int year =2021,month = 4,total = 0,weekday;
//先计算整数年的天数
for (int i=1900;i<year;i++){
//闰年和平年的天数不同
total+= i%4==0&&i%100!=0 || i%400==0?366:365;
}
//再计算整数月的天数
//day根据每个月的情况重新赋值
int day = 0;
for (int i = 1;i<=month;i++){
switch (i){
//根据swiech 的贯穿性,可以把相同天数的月份写在一起
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:
day= year%4==0&&year%100!=0 || year%400==0?29:28;
break;
}
//虽然i=month为止,但是当月的月天数不需要加到总数中,因此i<month
if (i<month){
total+=day;
continue;
}
}
//上个月最后一天
weekday=total%7;
//为了便于检查,输出当月总天数
System.out.println("这个月的天数"+day);
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
for (int i = 0; i <=(weekday==6?-1:weekday) ; i++) {
//周六为最后一天,每次周六结束后需要换行
//限制条件中为了防止开始就是周六,会造成开始就出现整行的制表符
//针对这种情况,给weekday赋值为-1,
System.out.print("\t");
}
for (int i = 1; i <=day ; i++) {
System.out.print(i+"\t");
if ((total+i)%7==6){
System.out.println();
}
}
最终运行结果如下:
根据月历,可以进行提升,给出年份,输出当年的年历,
逻辑和月历类似,代码如下:
Scanner input = new Scanner(System.in);
System.out.print("Please enter year: ");
int year = input.nextInt();
int month = 1;
final int WEEK = 7;
int total = 0, LastMonthLastDay, day=0;
int daysBeforeYear = 0;
// 先算整数年的天数
for (int i = 1900;i<year;i++){
daysBeforeYear += i%4 == 0 && i%100!=0 ||i%400==0 ? 366:365;
}
while (month<=12){
System.out.println("-------第 "+ month+"个月-------");
total = daysBeforeYear;
// 再算整数月的天数
// switch里的break只能跳出switch,如果用continue便可跳出循环
for (int i=1;i<=month;i++){
switch (i){
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:
day= year%4 == 0 && year%100!=0|| year%400 ==0?29:28;
break;
}
if (i<month){
total+=day;
}
}
//上个月最后一天是星期几
LastMonthLastDay = total%7;
// Print calendar
System.out.println("\n日\t一\t二\t三\t四\t五\t六");
// 周日是第一天,前面需要依次用制表位占空
for (int i=0;i<=LastMonthLastDay&&LastMonthLastDay!=6;i++){
System.out.print("\t");
}
// 周六是最后一天,每次周六结束后需要换行符
for (int i=1;i<=day;i++){
System.out.print(i+"\t");
if ((i+total)%7==6){
System.out.print("\n");
}
}
System.out.println("\n");
month++;
}
input.close();
运行结果部分截图如下: