根据年、月,生成该月日历 以及根据年份生成年历

求指定日期是星期几,
首先已知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();

运行结果部分截图如下:
运行结果部分截图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值