找到休息日

三个需要注意的点:

  1. 三个类以及相关方法的使用:Date,DateFormat,Calendar,特别是Calendar这个类的get,set和getActualMaximum方法,非常常用
  2. 闰年的计算,从我们出生开始,只要跟日历有关的,就脱离不了闰年的计算
  3. 注意是否跨年,跨的是否为闰年

因为只是个用于练习日期相关类的demo,就没有进行MVC相关类方法的分割,也没有封装方法,就这么一股脑的写过去了。毕竟跟弄一个快递系统相比,这个demo以后真的没什么维护的必要。
唯一卡了我很久的难点就是对齐问题,老师真没教左对齐和右对齐的概念,还好我女神度娘啥都有让我搜出来了,这个demo完结撒花

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class CalendarForRest {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        while (true) {
            //输入年、月
            System.out.println("请输入年:");
            String inputYear = input.nextLine();
            System.out.println("请输入月:");
            String inputMonth = input.nextLine();

            int year = Integer.parseInt(inputYear);
            int month = Integer.parseInt(inputMonth) - 1;

            //根据输入的年、月设定日历时间
            java.util.Calendar clSearch = java.util.Calendar.getInstance();
            clSearch.set(java.util.Calendar.YEAR, year);
            clSearch.set(java.util.Calendar.MONTH, month);
            clSearch.set(java.util.Calendar.DATE, 1);

            //第一天放假的日期是2020年2月2日
            java.util.Calendar clBase = java.util.Calendar.getInstance();
            clBase.set(java.util.Calendar.YEAR, 2020);
            clBase.set(java.util.Calendar.MONTH, 1);
            clBase.set(java.util.Calendar.DATE, 2);

            int maxDayOfMonth = clSearch.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);
            int firstDayOfWeek = clSearch.get(java.util.Calendar.DAY_OF_WEEK);

            // 确定是星期几
            int weekIndex = firstDayOfWeek - 1;
            // 确定是当月日历的第几行
            int monthRound = 0;
            // 周末一共休息多少天
            int weekendTotalRestDay = 0;
            // 当月一共休息多少天
            int monthTotalRestDay = 0;

            // distanceCount要计算日历中的天数与2020年2月2日的距离天数,如果是2020年2月,则不做处理
            int distanceCount = 0;
            if (!(clSearch.get(java.util.Calendar.YEAR) == 2020 && clSearch.get(java.util.Calendar.MONTH) == 1)) {
                int dayBase = clBase.get(java.util.Calendar.DAY_OF_YEAR);
                int daySearch = clSearch.get(java.util.Calendar.DAY_OF_YEAR);

                int yearBase = clBase.get(java.util.Calendar.YEAR);
                int yearSearch = clSearch.get(java.util.Calendar.YEAR);

                //不同一年
                if (yearBase != yearSearch) {
                    int timeDistance = 0;
                    for (int i = yearBase; i < yearSearch; i++) {
                        if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
                            timeDistance += 366;
                        } else {
                            timeDistance += 365;
                        }
                    }
                    distanceCount = timeDistance + (daySearch - dayBase + 1);
                } else {
                    distanceCount = daySearch - dayBase + 1 ;
                }
            }
            // 输出日历
            printCalendar(maxDayOfMonth,monthRound,weekIndex,distanceCount,monthTotalRestDay,weekendTotalRestDay);
        }
    }

    private static void printCalendar(int maxDayOfMonth,int monthRound,int weekIndex,int distanceCount,int monthTotalRestDay,int weekendTotalRestDay){
        for (int i = 0; i < maxDayOfMonth; i++) {
            //输出日历的主要逻辑
            if (monthRound == 0) {
                System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
                System.out.println();
                for (int j = weekIndex; j > 0; j--) {
                    System.out.print('\t');
                    System.out.print('\t');
                }
            }
            if (distanceCount % 4 == 1) {
                System.out.printf("%-8s","["+(i+1)+"]");
                monthTotalRestDay += 1;
                if (weekIndex == 0 || weekIndex == 6) {
                    weekendTotalRestDay += 1;
                }
            } else {
                System.out.printf("%-8d",i+1);
            }
            weekIndex++;
            monthRound++;
            distanceCount++;

            // 当遍历到周六时,换行
            if (weekIndex >= 7) {
                System.out.println();
                weekIndex = 0;
            }
        }
        System.out.println();
        System.out.println("本月休息天数有:" + monthTotalRestDay + "天");
        System.out.println("本月轮到周末休息的天数是:" + weekendTotalRestDay + "天");
        System.out.println();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值