任务名称

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

Java 同步下一年节假日 java节假日维护_System

 

代码及注释

代码1:数据处理部分

package com.java.task010301_002;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class FindDao {
    View view = new View();
    /**
     * 计算休息天数,并输出日期
     */
    public void calculate() throws ParseException {
        //获取指定年月
        int year = view.getYear();
        int month = view.getMonth()-1;//类中月份范围0-11,用户输入1-12
        // 使用默认时区和语言环境获得一个日历
        Calendar calendar = Calendar.getInstance();
        //设置当前日历为用户输入的日期
        calendar.set(year,month,1);
        //获取本月最大天数----DAY_OF_MONTH:get和 set字段编号表示当月的日期。
        int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        //判断本月第一天是星期几------DAY_OF_WEEK: get和set字段编号表示星期几
        int week = calendar.get(Calendar.DAY_OF_WEEK);
        //日历横头---星期显示
        view.weekView();
        //第一天是星期几,前面就留出多少空格,保证对齐
        for (int i=1;i<week;i++){
            System.out.printf("%-8s"," ");//printf输出格式----%-8s字符串,长度为8,左对齐
        }
        //本月休息天数
        int restDay = 0;
        //本月周末休息天数
        int restWeekDay = 0;
        //循环本月的每一天,判断是否是休息日,休息日是否是周末,并输出显示,休息日期用()圈出
        for (int i=1;i<=maxDay;i++){
            calendar.set(Calendar.DAY_OF_MONTH,i);//设置当前日历日期为i日
            //返回Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。
            Date date = calendar.getTime();
            //判断该天是否为休息日
            if (isRestDay(date)){
                System.out.printf("%-8s","("+calendar.get(Calendar.DAY_OF_MONTH)+")");//输出当前日期,并做出标记
                restDay++;//休息日变量增加
                //判断该休息日是否为周末
                if (calendar.get(Calendar.DAY_OF_WEEK)==6 || calendar.get(Calendar.DAY_OF_WEEK)==6){
                    restWeekDay++;//周末休息天数增加
                }
            }else{
                System.out.printf("%-8s",i);//如果不是休息日,直接输入日期
            }
            //每周换行显示
            if (calendar.get(Calendar.DAY_OF_WEEK) == 7){
                System.out.println();
            }
        }
        System.out.println();
        System.out.println("本月休息天数有:"+restDay+"天");
        System.out.println("本月轮到周末休息天数有:"+restWeekDay+"天");

    }

    /**
     * 判断是否为休息日
     * @param date
     * @return
     * @throws ParseException
     */
    public static boolean isRestDay(Date date) throws ParseException {
        //SimpleDateFormat是一个用于以区域设置敏感的方式格式化和解析日期的具体类。
        // 它允许格式化(日期→文本),解析(文本→日期)和规范化。
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        //设置最开始的休息日日期
        Date startDate = format.parse("2020-02-02");
        //得到开始日期的毫秒数
        long startTime = startDate.getTime();
        //得到当前日历的毫秒数
        long dateTime = date.getTime();
        //两个毫秒数做差,算出天数
        int days = (int)((dateTime-startTime)/1000/60/60/24);
        //每三天休一天,四天为一个单位,第四天就是休息日,
        // 从2020-02-02开始,之前日期不算,所以毫秒数差不能为负数
        if (dateTime-startTime>=0 && days%4==0){
            return true;
        }
        return false;
    }
}

代码2:数据输出展示部分 (视图部分)

package com.java.task010301_002;

import java.util.Scanner;

public class View {
    Scanner input = new Scanner(System.in);
    //获取年份:
    public int getYear(){
        System.out.println("请输入年:");
        String inputYear = input.nextLine();
        int year = -1;
        try {
            year = Integer.parseInt(inputYear);
        }catch (NumberFormatException e){
        }
        if (year<1000 || year>10000){
            System.out.println("格式输入有误,请重新输入---");
            return getYear();
        }
        return year;
    }
    //获取月份
    public int getMonth(){
        System.out.println("请输入月份:");
        String inputMonth = input.nextLine();
        int month = -1;
        try {
           month = Integer.parseInt(inputMonth);
        } catch (NumberFormatException e) {
        }
        if (month<1 || month>13){
            System.out.println("格式输入有误,请重新输入---");
            return getMonth();
        }
        return month;
    }
    //是否继续查找
    public int proceedFind(){
        System.out.println("是否继续查找?1.继续 0.退出");
        String s = input.nextLine();
        int flag = -1;
        try {
            flag = Integer.parseInt(s);
        }catch (NumberFormatException e){
        }
        if (flag!=0 && flag!=1){
            System.out.println("格式输入有误,请重新输入---");
            return proceedFind();
        }
        return flag;
    }
    //日历横头---星期显示
    public void weekView(){
        System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
    }
}

代码3:主函数调用部分 

package com.java.task010301_002;

import java.text.ParseException;

public class MainTest {
    public static void main(String[] args) throws ParseException {
        FindDao findDao = new FindDao();
        View view = new View();
        while (true){
            System.out.println("-------欢迎来到工作日/休息日查询系统---------");
            findDao.calculate();
            //判断是否继续
            int proceed = view.proceedFind();
            if (proceed == 0){
                System.out.println("感谢使用!");
                break;
            }
        }
    }
}

运行结果展示 

注意:题目要求从2020年2月2日开始,所以我们要首先验证一下,开始时间是否符合题意。因为本人出现过这种错误,所以在此小小提醒一下。

Java 同步下一年节假日 java节假日维护_java_02

实现继续查找功能: 

Java 同步下一年节假日 java节假日维护_System_03

 

实现退出功能: 

 

Java 同步下一年节假日 java节假日维护_System_04

总结

对之前所学的知识点做一个小小的总结,希望各位大佬不吝赐教。