找到休息日

概述:

某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有几天.(注:首次休息日是 2020 年 2 月 2 日)

步骤

1.获取年月(键盘输入),简单的判断和异常处理

//获取年份
   public static int getYear(){
       int year = -1;
       System.out.println("请输入年:");
       String theYear = input.nextLine();
       try{//输入的一定是一个数字
           year = Integer.parseInt(theYear);
       }catch (NumberFormatException e){
           System.out.println("请输入数字!");
       }

       //孙工工作了好多年啊~~~~
       if(year < 2020 || year > 2100){
           System.out.println("输入的年份有误,请重新输入!");
           return getYear();
       }

       return year;
   }

   //获取月份
   public static int getMonth(){
       int month = -1;
       System.out.println("请输入月:");
       String theMonth = input.nextLine();
       try{//输入的一定是一个数字
           month = Integer.parseInt(theMonth);
       }catch (NumberFormatException e){
           System.out.println("请输入数字!");
       }

       //月份只能从1到12
       if(month < 1 || month > 12){
           System.out.println("输入的月份有误,请重新输入!");
           return getMonth();
       }

       return month;
   }

2.获取孙工的休息日(调用方法并保存到一个全局数组中)
数组中的休息日字符串要进行格式化如:2020年2月2日格式化为20200202,如果不格式化如:2020年1月12日(2020112)和2020年11月2日(2020112)会混淆,格式化后的字符串为20200112、20201102

	//先获取休息日,用一个全局数组来保存日期
    static void restDay(){
        int MAX_REST_DAY = 10000;//我们要找多少个休息日

        Calendar calendar = Calendar.getInstance();

        //设置首个休息日时间,月份实际为2月
        calendar.set(2020, 1, 2);

        //这儿是找最大休息日天数个休息日,上面可以修改
        for(int i = 0; i < MAX_REST_DAY; i ++){
            //获得年月日
            String y = String.valueOf(calendar.get(Calendar.YEAR));
            String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
            String d = String.valueOf(calendar.get(Calendar.DATE));

            //将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
            if ((calendar.get(Calendar.MONTH) + 1) < 10) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(m);
                m = stringBuilder.toString();
            }
            if (calendar.get(Calendar.DATE) < 10){
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(d);
                d = stringBuilder.toString();
            }

            //拼接成字符串
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(y);
            stringBuilder.append(m);
            stringBuilder.append(d);
            //利用变量date保存日期值
            String date = stringBuilder.toString();

            //该日期是休息日,存入list数组中
            list.add(date);

            //日历的日期加四(每隔三天休息)
            calendar.add(Calendar.DATE, 4);
        }
    }

3.先得到输入的年份月份的每一天的格式化字符串,然后判断是否为休息日及周末休息日,是休息日就添加上[],休息日天数加一,是周末休息日,周末休息日天数加一

	//获取当月的最大日期
    int maxDate = calendar.getActualMaximum(Calendar.DATE);
    for(int i = 1; i <= maxDate; i ++){
        calendar.set(Calendar.DATE, i);

        //获取年月日
        String y = String.valueOf(calendar.get(Calendar.YEAR));
        String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
        String d = String.valueOf(calendar.get(Calendar.DATE));

        //将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
        if ((calendar.get(Calendar.MONTH) + 1) < 10) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("0");
            stringBuilder.append(m);
            m = stringBuilder.toString();
        }
        if (calendar.get(Calendar.DATE) < 10){
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("0");
            stringBuilder.append(d);
            d = stringBuilder.toString();
        }

        //拼接字符串
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(y);
        stringBuilder.append(m);
        stringBuilder.append(d);
        //利用变量date保存格式化好的日期值
        String date = stringBuilder.toString();

        //获取日期
        int day = calendar.get(Calendar.DATE);
        //将日期转化为字符串
        String newDay = String.valueOf(day);
        //判断是不是休息日(数组有没有这个元素,有的话就是)
        if (list.contains(date)){
            //利用StringBuilder可以降低内存的消耗
            // 是休息日的话就加个[]
            StringBuilder stringBuilder1 = new StringBuilder();
            stringBuilder1.append("[");
            stringBuilder1.append(newDay);
            stringBuilder1.append("]");
            newDay = stringBuilder1.toString();

            //是休息日的话休息天数加一
            restDayCount++;

            //是休息日并且是周末
            if(calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7){
                restWeekCount++;//周末休息天数加一
            }
        }else {//不是休息日,不加[],但是前后各添加一个空格来对齐
            StringBuilder stringBuilder1 = new StringBuilder();
            stringBuilder1.append(" ");
            stringBuilder1.append(newDay);
            stringBuilder1.append(" ");
            newDay = stringBuilder1.toString();
        }

        if(day < 10){//天数少于10,前面添加一个空格来对齐
            StringBuilder stringBuilder1 = new StringBuilder();
            stringBuilder1.append(" ");
            stringBuilder1.append(newDay);
            newDay = stringBuilder1.toString();
        }

        //添加到日历数组中
        calendarList.add(newDay);
    }

4.最后打印日历及统计信息

	//打印
	for(int j = 0; j < calendarList.size(); j ++){
	    System.out.print(calendarList.get(j) + "    ");
	    if(j % 7 == 0){//七次换行
	        System.out.println();
	    }
	}
	
	//最后统计输出
	System.out.println();
	System.out.println("本月休息天数有:" + restDayCount + "天");
	System.out.println("本月轮到周末的休息天数是" + restWeekCount + "天");

完整代码

	public static Scanner input = new Scanner(System.in);

    //全局数组,用来保存休息日的日期,例如第一个休息日20200202
    static List<String> list = new ArrayList<>();

    public static void main(String[] args) throws ParseException {
        int year;//接收年份
        int month;//接收月份

        int restDayCount = 0;//当月休息天数
        int restWeekCount = 0;//当月周末休息天数

        //创建日历对象
        Calendar calendar = Calendar.getInstance();

        //创建一个日历集合来保存日历
        List<String> calendarList = new ArrayList<>();

        //获取键盘输入的年月
        year = getYear();
        month = getMonth();

        //获取一定范围内的休息日期,用全局数组接收
        restDay();

        //设置年月日
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        calendar.set(Calendar.DATE, 1);

        //获得该月第一天是星期几,星期日为1---->星期六为7
        int startDay = calendar.get(Calendar.DAY_OF_WEEK);

        System.out.println("星期日   星期一   星期二   星期三   星期四   星期五   星期六");
        //将第一天前面的位置用空格补齐
        for(int i = 0; i < startDay; i ++){
            calendarList.add("    ");
        }

        //获取当月的最大日期
        int maxDate = calendar.getActualMaximum(Calendar.DATE);
        for(int i = 1; i <= maxDate; i ++){
            calendar.set(Calendar.DATE, i);

            //获取年月日
            String y = String.valueOf(calendar.get(Calendar.YEAR));
            String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
            String d = String.valueOf(calendar.get(Calendar.DATE));

            //将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
            if ((calendar.get(Calendar.MONTH) + 1) < 10) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(m);
                m = stringBuilder.toString();
            }
            if (calendar.get(Calendar.DATE) < 10){
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(d);
                d = stringBuilder.toString();
            }

            //拼接字符串
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(y);
            stringBuilder.append(m);
            stringBuilder.append(d);
            //利用变量date保存格式化好的日期值
            String date = stringBuilder.toString();

            //获取日期
            int day = calendar.get(Calendar.DATE);
            //将日期转化为字符串
            String newDay = String.valueOf(day);
            //判断是不是休息日(数组有没有这个元素,有的话就是)
            if (list.contains(date)){
                //利用StringBuilder可以降低内存的消耗
                // 是休息日的话就加个[]
                StringBuilder stringBuilder1 = new StringBuilder();
                stringBuilder1.append("[");
                stringBuilder1.append(newDay);
                stringBuilder1.append("]");
                newDay = stringBuilder1.toString();

                //是休息日的话休息天数加一
                restDayCount++;

                //是休息日并且是周末
                if(calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7){
                    restWeekCount++;//周末休息天数加一
                }
            }else {//不是休息日,不加[],但是前后各添加一个空格来对齐
                StringBuilder stringBuilder1 = new StringBuilder();
                stringBuilder1.append(" ");
                stringBuilder1.append(newDay);
                stringBuilder1.append(" ");
                newDay = stringBuilder1.toString();
            }

            if(day < 10){//天数少于10,前面添加一个空格来对齐
                StringBuilder stringBuilder1 = new StringBuilder();
                stringBuilder1.append(" ");
                stringBuilder1.append(newDay);
                newDay = stringBuilder1.toString();
            }

            //添加到日历数组中
            calendarList.add(newDay);
        }

        //打印
        for(int j = 0; j < calendarList.size(); j ++){
            System.out.print(calendarList.get(j) + "    ");
            if(j % 7 == 0){//七次换行
                System.out.println();
            }
        }

        //最后统计输出
        System.out.println();
        System.out.println("本月休息天数有:" + restDayCount + "天");
        System.out.println("本月轮到周末的休息天数是" + restWeekCount + "天");

    }

    //获取年份
    public static int getYear(){
        int year = -1;
        System.out.println("请输入年:");
        String theYear = input.nextLine();
        try{//输入的一定是一个数字
            year = Integer.parseInt(theYear);
        }catch (NumberFormatException e){
            System.out.println("请输入数字!");
        }

        //人也只能活个100岁多点,再多就不行了
        if(year < 2020 || year > 2100){
            System.out.println("输入的年份有误,请重新输入!");
            return getYear();
        }

        return year;
    }

    //获取月份
    public static int getMonth(){
        int month = -1;
        System.out.println("请输入月:");
        String theMonth = input.nextLine();
        try{//输入的一定是一个数字
            month = Integer.parseInt(theMonth);
        }catch (NumberFormatException e){
            System.out.println("请输入数字!");
        }

        //月份只能从1到12
        if(month < 1 || month > 12){
            System.out.println("输入的月份有误,请重新输入!");
            return getMonth();
        }

        return month;
    }

    //先获取休息日,用一个全局数组来保存日期
    static void restDay(){
        int MAX_REST_DAY = 10000;//我们要找多少个休息日

        Calendar calendar = Calendar.getInstance();

        //设置首个休息日时间,月份实际为2月
        calendar.set(2020, 1, 2);

        //这儿是找最大休息日天数个休息日,上面可以修改
        for(int i = 0; i < MAX_REST_DAY; i ++){
            //获得年月日
            String y = String.valueOf(calendar.get(Calendar.YEAR));
            String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
            String d = String.valueOf(calendar.get(Calendar.DATE));

            //将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
            if ((calendar.get(Calendar.MONTH) + 1) < 10) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(m);
                m = stringBuilder.toString();
            }
            if (calendar.get(Calendar.DATE) < 10){
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(d);
                d = stringBuilder.toString();
            }

            //拼接成字符串
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(y);
            stringBuilder.append(m);
            stringBuilder.append(d);
            //利用变量date保存日期值
            String date = stringBuilder.toString();

            //该日期是休息日,存入list数组中
            list.add(date);

            //日历的日期加四(每隔三天休息)
            calendar.add(Calendar.DATE, 4);
        }
    }

运行截图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值