Java万年历

已知条件:
1900年1月1日是星期一。
闰年的特征:能被4整除且又能不能被100整除 ,或能被400整除。
用Java设计一个万年历程序,效果如下:
图片

程序的关键问题是怎样控制所输入的年月的第一天是星期几,第一天是星期一就不需要打印前面的空白,星期二就打印一个空白...
同时还需要在日期是星期天的时候换行。
而要知道某个日期是星期几只能根据1900.1.1日这个条件来判断,距离7天,14天,21,28.....N个7天后都是星期一,因此需要计算所选年月的1号是星期几来确定1号前面的空白距离以及月份中日期是不是星期天的计算。由此,需要计算所选年月与1900.1.1相距的天数,进一步拆分为年份的累计天数和月份的累计天数。

public static void main(String[] a){
        int year=1900;
        int month=1;
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要打印的万能历年份:");
        year=scanner.nextInt();

        System.out.println("请输入你要打印的万能历月份:");
        month=scanner.nextInt();

        System.out.print("一\t");
        System.out.print("二\t");
        System.out.print("三\t");
        System.out.print("四\t");
        System.out.print("五\t");
        System.out.print("六\t");
        System.out.print("日\t");
        System.out.println("\n");


        int totalDay=0;
        for(int i=1900;i<year;i++){ //1900年1月1日到所输入的年份1月1日的天数,不包括当年
            if((i%4==0 && i%100!=0) || i%400==0){ //闰年
               totalDay+=366;
            }else{
                totalDay+=365;
            }
        }
        //累加当年1月到输入月份1号的天数
        for(int i=1;i<month;i++){
           if(i==2){
               if((year%4==0 && year%100!=0) || year%400==0){ //当前这一年是闰年
                    totalDay+=29;
               }else{
                   totalDay+=28;
               }
           }else if(i==4 || i==6 || i==9 || i==11){
               totalDay+=30; //4,6,9,11月固定30天,2月28或29天,其他月份固定31天
           }else{
               totalDay+=31;
           }
        }

        int monthDays=0;//当前这个月的天数,用来控制打印多少个数字

        if(month==2){
            if((year%4==0 && year%100!=0) || year%400==0){ //当前这一年是闰年
                monthDays=29;
            }else{
                monthDays=28;
            }
        }else if(month==4 || month==6 || month==9 || month==11){
            monthDays=30;
        }else{
            monthDays=31;
        }

        //总天数与1900.1.1相距多少个7天都是星期一,1900.1.1是星期一,1900.1.8后也是星期一,距离7天,
        int _1_xq= (totalDay)%7; //N个7天后都是星期一,余数为0表示星期一,由于我们是从星期一到星期天的顺序显示,是星期一就打印0个\t,星期二就打印1个\t,星期三就打印2个\t...n-1个\t
        //控制月份的第一天的位置,余数为几就打印几个\t
        for(int t=0;t<_1_xq;t++){
            System.out.print("\t");
        }

        for(int i=1;i<=monthDays;i++){
            int xq=((totalDay+i-1)%7);//相距多少天要减一,1.1到1.8
            System.out.print(i);
            if(xq==6){ //余数是六表示星期日,是星期日就换行
                System.out.println("\n");
            }else{
                System.out.print("\t");
            }
        }

    }

运行结果:

图片 
 

====================================================================================
关注微信公众号 “Java技术”,可以实时获取有价值的技术文章推送。
"Java技术"交流群: 245130488 

"Java软件工程师培训"系列课程正式推出,助你自学成才,进入IT行业。

www.chuanke.com/s3377987.html

 

 本文用 菊子曰发布

你可能感兴趣的:(Java万年历)