万年历的话就是有从1990.1.1开始的所有年份的月份的信息。下面将实现一个某年某月的信息。
从键盘上输入年份和月份,显示当前月份的日历的信息,输出日历的头部 ,输出空格,输出日期。(1900.1.1号是星期一)
如:
输出指定月的月份,需要了解该月的相关条件:
1.该月有多少天
2.该月的1号是星期几(求距离1990.1.1的总天数)
3.如何将当月日期一一对应星期
解决了这三个问题,就可以打印出指定年份的月的日历了。
一、求某年某月里该月里面有多少天
众所周知,一年12个月当中除了2月天数都是固定的。只有2月才随年份改变。
如何判断月份是小月还是大月会简单(手紧握)。大月就是该月有31天,小月就是有30天,基本是不需要年份就可以判断该月的天数的,唯独一个二月,二月就需要年份的判断。二月是一个小月,按前面来说应该是30天的,但是就是它不同,2月在闰年的时候是29天,在平年的时候是28天。这样的话就需要判断该年是闰年还是平年。就可以知道指定月里有多少天数了。
1.判断某年是闰年和平年
如果某年是闰年的话,该年一共有366天,因为2月是29天。平年的话,就是365天。
闰年是啥:
1.该年份能被4整除且不能被100整除。
或 2.该年份能被400整除。
public static boolean isLeap(int year){//如何year是闰年则返回true,否则返回false
if( ( year%4 == 0 && year%100 != 0 ) || year%400 == 0 ){
return true;
}
return false;
}
2.求出某年某月有多少天
public static int getMonthDay(int year,int month){
int days = 0;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;break;
case 2:
if(isLeap(year)){ //是闰年
days = 29;
}else{
days = 28;
}
break;
case 4:
case 6:
case 9:
case 11:
days = 30;break;
}
return days;
}
二、该月的1号是星期几(求距离1990.1.1的总天数)
如何求该月1号是星期几。首先要求出该年该月距离1990.1.1的总天数是多少,然后在除以7余下的的余数就是该月1号是星期几了。因为每周只有7天,星期一到星期七,在星期七再过一天就是星期一了,那就是相当于每7天就会重新开始,所以要求除7的余数。
1.求某年某月距离1990.1.1的总天数
前面已经知道了如何判断闰年和每个月的天数,所以要求距离1990.1.1的总天数,就是从某年-1990 依次遍历,和某年某月剩下的天数依次求解就行啦。
public static int getTotalDays(int year ,int month){
int days = 0;
//计算[1990,year)年份的天数 year年不完整 按月来计算
for(int i=1990;i<year;i++){
if(isLeap){ //判断该年是不是闰年
days+=366;
}else{
days+=365;
}
}
//计算本年剩下的月份的天数
//[1,month)
for(int j=0;j<month;j++){
days+=getMonthDays(year,j);
}
days++;//当前month月是1号,所以要+1
return days;
}
2.根据总天数求该月1号是星期几.
int FirstDay = getTotalDays(year,month)%7;
三、如何将当月日期一一对应星期
已经知道了该月1号是星期几了,基本上就可以输出该月的信息了。则1号前的位置就可以是空格,或者是输入上个月的最后几天。至于如何排版的问题,每一行至多只有7天。只需要判断该月的天数是否能够整除1号的星期 ,那么输出这个日期之后就需要换行了。
for(int i=1;i<getMonthDay();i++){
System.out.println(i+"\t");
if(i%FirstDay==0){
System.out.println(); //换行
}
}
注意点:
一、之所以要判断该年为闰年和平年:1.求出某年2月的天数,2.求某年某月到1990.1.1的天数。
根据以上的思路,只要知道如何求某年某月的日期信息,就大致可以打印出自1990.1.1起的所有日期信息了。在加一个窗口设计,基本就可以做一个万年历了。