找到休息日

某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对 应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休 息有几天.(注:首次休息日是2020年2月2日)
在这里插入图片描述
要想解决这道题,首先我们要弄懂日历类是什么,该怎么用,然后才是去想判断的逻辑关系。本人也是刚学不久,理解的也不是很全面,在这里我只分享一下在做本题时的想法和思路。
首先日历类我们不是new出来的,是通过Calendar c1 = Calendar.getInstance();获取的,所以我简单的理解为这个日历类本来就存在在电脑里,我们只是拿来用。我们获取了之后,就可以设置年、月(这也是用户需要输入的内容),然后日历类就定位到了我们设置的那一个月的日历。这时候我们想要的数据都可以通过日历类的各种方法进行获取。
其次就是判断的逻辑关系了,我要判断某一天是否休息,那么我先找一个时间零点(这里我找的就是2020-2-1),然后通过for循环去获取当月的每一天,通过格林威治时间可以计算出这中间间隔天数,然后再通过间隔天数除四取余,判断这一天是否休息。
代码如下:

public class Views {

    private Scanner s = new Scanner(System.in);

    /**
     * 让用户输入年的操作
     * @return
     */
    public int year(){
        System.out.println("欢迎使用XX日历系统");
        System.out.println("请输入你想要查找的年:");
        String text = s.nextLine();
        int year = -1;
        try{
            year = Integer.parseInt(text);
        }catch (NumberFormatException e){

        }
        return year;
    }

    /**
     * 让用户输入月的操作
     * @return
     */
    public int month(){
        System.out.println("请输入你想要查找的月:");
        String text = s.nextLine();
        int mon = -1;
        try{
            mon = Integer.parseInt(text)-1;
        }catch (NumberFormatException e){

        }
        if(mon < 0&& mon >11){
            System.out.println("输入有误,请重新输入:");
            return month();
        }
        return mon;
    }
}
public class PrintCalendar {
    public static void main(String[] args) throws ParseException {
        //新建输入的对象
        Views view = new Views();
        int year = view.year();
        int mon = view.month();

        //获取一个日历类的对象
        Calendar c1 = Calendar.getInstance();
        //设置日历的年,月,这就相当于用户输入年月后,我们需要先定位到当前月的日历
        c1.set(Calendar.YEAR,year);
        c1.set(Calendar.MONTH,mon);

        //先判断本月的第一天是星期几
        int week = c1.get(Calendar.DAY_OF_WEEK);

        //获取本月的最大天数
        int dayOfMonth = c1.getActualMaximum(Calendar.DAY_OF_MONTH);

        //打印日历
        //首先打印第一行星期的日期
        System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
        //然后打印第一行的空格
        for(int i=1; i<week; i++) {
            System.out.printf("%-8s","");
        }
        //定义两个变量,统计本月休息天数和在休息日休息天数
        int relaxdays = 0;
        int relaxCount = 0;

        //然后打印这个月的每一天的信息
        for(int i=1; i<=dayOfMonth; i++){
            //这里先设置一下这是哪年哪月哪天,
            c1.set(Calendar.DAY_OF_MONTH,i);
            //然后将其转换为格林威治时间,然后和前面的2020-2-1进行计算,得出这里面相隔了多少天
            //将上述思想包装成一个方法,方便思考
            Date temp = c1.getTime();
            int days = intervalDays(temp);
            //判断这一天是否休息
            if(days%4 == 1){
                System.out.printf("%-8s","["+c1.get(Calendar.DAY_OF_MONTH)+"]");
                relaxdays++;
                //判断这一天是否是休息日
                if(c1.get(Calendar.DAY_OF_WEEK) ==1 ||c1.get(Calendar.DAY_OF_WEEK) == 7){
                    relaxCount++;
                }
            }else{
                System.out.printf("%-8s",c1.get(Calendar.DAY_OF_MONTH));
            }
            //如果这一天是星期六,则换行
            if(c1.get(Calendar.DAY_OF_WEEK) == 7){
                System.out.println();
            }
        }
        System.out.println();
        System.out.println("本月一共休息天数"+relaxdays);
        System.out.println("本月休息日休息天数"+relaxCount);
    }
    //计算间隔时间的方法
    public static int intervalDays(Date now)throws ParseException{
        //获取日历中第i天的格林威治时间
        long timeEnd = now.getTime();
        //创建一个格式化日期类的模板,获取一下2020-02-01的格林威治时间
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = format.parse("2020-02-01");
        long timeStart = date.getTime();
        //计算两个时间戳相隔的天数
        int days = (int)((timeEnd - timeStart)/(24*60*60*1000));
        return  days;
    }
}

代码第一个view类就是一个接收用户输入的功能,这里我写的比较多,也可以写简单点,直接写在打印日历类里面。
本人初学java,如果有什么错误之处,欢迎各位大佬指正。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页