03-Java核心类库_第2节 常用类库_《找到休息日》

1,任务描述

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

03-Java核心类库_第2节 常用类库_《找到休息日》_第1张图片

2,参考链接

@辣辣写代码_nanaProgrammer【Java Calendar类 练习题:为孙工找到当月休息日】

1,获得字符串对齐的灵感,Java也可以使用printf函数。

  • System.out.printf("%-8s", "");                  // 8个字符左对齐

2,由于平台不同IDEA和Eclipse中的\t表示格式不同:

  • Eclipse(补全当前字符串长度到8的整数倍,补齐后长度为8*k个空格的长度);
  • IDEA(补全当前字符串长度到4的整数倍,补齐后长度为4*k个空格的长度);

@&再见萤火虫&【03-Java核心类库】

关于Date和Calendar类的使用,可以参考这里;

3,参考代码 

package com.kaikeba;

import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;

public class Demo1 {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();              // 获得Calendar对象
        int year = 0, month = 0;                            // 收集用户输入的年份和月份
        int restYear = 2020, restMon = 2, restDay = 2;      // 设定休息日
        boolean flag = false;                               // 判断输入是否正确
        Scanner input = new Scanner(System.in);

        // 获得合法的年份
        System.out.println("请输入年:");
        do {
            String s = input.nextLine();
            if(isInteger(s)){                               // 是整数
                year = Integer.parseInt(s);                 // 字符串转换为整型
                break;
            }
            System.out.println("年份输入有误,请重新输入:");
        }while (!flag);
        System.out.println("请输入月:");

        // 获得合法的月份
        do {
            String s = input.nextLine();
            if(isInteger(s)){                               // 是整数
                month = Integer.parseInt(s);                // 字符串转换为整型
                if(month >= 1 && month <= 12){              // 月份合理
                    break;
                }
            }
            System.out.println("月份输入有误,请重新输入:");
        }while (!flag);

        // 获得用户输入日期对应的信息:
        // 该月第一天对应星期几,该月有几天,日期对应的Date对象(用于获取格林威治时间毫秒数,计算与休息日相差的天数)
        cal.set(Calendar.YEAR, year);                       // 设置用户输入的年份
        cal.set(Calendar.MONDAY, month - 1);                // 设置用户输入的月份(输入1-12,实际0-11,所以需要减一)
        cal.set(Calendar.DATE, 1);                          // 设置日期为1
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;  // 当前日期是该周的第几天
        int maxDayOfMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);    // 该月的最大天数
        Date userInputDate = cal.getTime();                 // 获取用户输入的日期对应的Date对象

        // 获得设定的休息日期对应的信息:
        // 日期对应的Date对象(用于获取格林威治时间毫秒数,计算与休息日相差的天数)
        cal.set(Calendar.YEAR, restYear);                   // 设置休息的年份
        cal.set(Calendar.MONDAY, restMon - 1);              // 设置休息的月份
        cal.set(Calendar.DATE, restDay);                    // 设置休息的日期
        Date restDayDate = cal.getTime();                   // 获取休息的日期对应的Date对象

        int diffOfDays = (int) (userInputDate.getTime() - restDayDate.getTime()) / 1000 / 60 / 60 / 24; // 当前日期与休息日期相隔天数
        int restDays = 0, restDaysInWeek = 0;               // 休息天数 周末休息的天数

        System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
        for(int i = 0; i < dayOfWeek; i++){
            System.out.printf("%-8s", "");                  // 8个字符左对齐 java中也可以用printf函数!
        }
        for(int i = 1; i <= maxDayOfMonth; i++){
            if(diffOfDays % 4 == 0){                        // 休息日
                System.out.printf("%-8s", "[" + i + "]");
                restDays++;
                if(dayOfWeek == 0 || dayOfWeek == 6){       // 周末休息
                    restDaysInWeek++;
                }
            }else {
                System.out.printf("%-8s", i);               // 工作日
            }
            dayOfWeek++;
            if(dayOfWeek % 7 == 0){                         // 一周结束,需要换行
                dayOfWeek = 0;
                System.out.println();
            }
            diffOfDays++;
        }
        System.out.println();
        System.out.println("本月休息天数有:" + restDays +"天");
        System.out.println("本月轮到周末休息天数是"+ restDaysInWeek + "天");
    }

    /*方法二:推荐,速度最快
     * 判断是否为整数
     * @param str 传入的字符串
     * @return 是整数返回true,否则返回false
     */

    public static boolean isInteger(String str) {
        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
        return pattern.matcher(str).matches();
    }
}

4,运行结果

03-Java核心类库_第2节 常用类库_《找到休息日》_第2张图片

你可能感兴趣的:(#,任务卡,Java核心类库,找到休息日,字符串对齐)