如何实现一个万年历

时间:2021-04-07作者:klpeng分类:IT综合浏览:623评论:0

万年历的话就是有从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起的所有日期信息了。在加一个窗口设计,基本就可以做一个万年历了。

 

 

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
上一篇:数组循环左移 下一篇:Python3 threading
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢