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