Java Calendar类 练习题:为孙工找到当月休息日

本文介绍了一个Java程序,帮助工程师孙工找出特定月份的休息日。程序按照上三天班、休一天的规律,标记出休息日,并统计休息天数。代码包括Views、DateDao和Main三个部分,通过StringBuffer实现日历展示。作者提到代码可能存在的不足,如对齐问题,并表达了对前端学习的兴趣。
摘要由CSDN通过智能技术生成


题目

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


不多说直接上代码

代码

一、Views


import java.util.Scanner;

public class Views {
    Scanner input = new Scanner(System.in);

    /**
     * 欢迎界面
     */
    public void hellow() {
        System.out.println("你好,孙工");
    }

    /**
     * 年份输入界面
     *
     * @return 用户输入的年份
     */
    public int inputYear() {
        System.out.println("请输入年:");
        int year = -1;
        try {
            year = Integer.parseInt(input.nextLine());
        } catch (NumberFormatException e) {
            System.out.println("输入有误,请重新输入");
            return inputYear();
        }
        if (year < 0) {
            System.out.println("输入有误,请重新输入");
            return inputYear();
        }
        return year;

    }

    /**
     * 月份输入界面
     *
     * @return 用户输入的月份1-12
     */
    public int inputMonth() {
        System.out.println("请输入月:");
        int month = -1;
        try {
            month = Integer.parseInt(input.nextLine());
        } catch (NumberFormatException e) {
            System.out.println("输入有误,请重新输入");
            return inputMonth();
        }
        if (month < 1 || month > 12) {
            System.out.println("输入有误,请重新输入");
            return inputMonth();
        }
        return month;
    }

    /**
     * 显示本月休息天数
     *
     * @param count 休息日计数
     */
    public void showRelaxDay(int count) {
        StringBuffer sb = new StringBuffer();
        sb.append("本月休息天数有:");
        sb.append(count);
        sb.append("天");
        //System.out.println("本月休息天数有:" + count + "天");
        System.out.println(sb.toString());
    }

    /**
     * 显示本月轮到周末休息天数
     *
     * @param count 休息周末计数
     */
    public void showRelaxWeekends(int count) {
        System.out.println("本月轮到周末休息天数是:" + count + "天");
    }

    /**
     * 打印工作日历
     *
     * @param workcaleader 工作日历
     */
    public void showWorkCalendar(StringBuffer workcaleader) {
        System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
        System.out.println(workcaleader);
    }
}

二、DateDao


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

public class DateDao {
    private Calendar calendar = Calendar.getInstance();
    public int relaxdaycount = 0;
    public int relaxweekendscount = 0;

    /**
     * 设置年
     *
     * @param year
     * @return
     */
    public Calendar inputYear(int year) {
        calendar.set(Calendar.YEAR, year);
        return calendar;
    }

    /**
     * 设置月
     *
     * @param month 用户输入为1-12,系统月份0-11
     * @return
     */
    public Calendar inputMonth(int month) {
        calendar.set(Calendar.MONTH, (month - 1));
        return calendar;
    }

    /**
     * 设置日
     *
     * @return
     */
    public Calendar inputDay(int day) {
        calendar.set(Calendar.DATE, day);
        return calendar;
    }

    /**
     * 获取工作日历
     *
     * @return
     */
    public StringBuffer getWorkCalendar() {
        StringBuffer sb = new StringBuffer();
//        calendar.set(Calendar.DATE,1);
        for (int i = 0; i < calendar.get(Calendar.DAY_OF_WEEK) + 1; i++) {
            sb.append("\t\t");
        }
        for (int a = 1; a <= calendar.getActualMaximum(Calendar.DATE); a++) {
            calendar.set(Calendar.DAY_OF_MONTH, a);
            if (getIntervalDay(calendar.getTime()) % 4 == 0) {
                sb.append("[");
                sb.append(a);
                sb.append("] \t");
                relaxdaycount++;
                if (calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7) {
                    relaxweekendscount++;
                }
            } else {
                sb.append(a);
                sb.append("\t\t");
            }
            //周六,换行
            if (calendar.get(Calendar.DAY_OF_WEEK) == 7) {
                sb.append("\n");
            }

        }
        return sb;
    }
	 /**
     * 获取间隔天数
     *以便判断是否是休息日
     * @param date 指定时间
     * @return 指定时间与工作开始日2020-02-02的间隔天数,过早,返回-1
     */
    public int getIntervalDay(Date date) {
        Date date2 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        //simpleDateFormat.setLenient(true);
        //String s="2020-02-02";
        try {
            date2 = simpleDateFormat.parse("2020-02-02");
        } catch (ParseException p) {
        }
        int intervalday = -1;
        if (date.getTime() - date2.getTime() < 0) {
            return intervalday;
        } else {
            intervalday = (int) ((date.getTime() - date2.getTime()) / 1000 / 60 / 60 / 24);
        }
        return intervalday;
    }
}

三、Main


import kaikeba.chapter4.section2.dao.DateDao;
import kaikeba.chapter4.section2.view.Views;

import java.util.Date;

public class Main {
    public static void main(String args[]){
        Views v=new Views();
        DateDao dao=new DateDao();
        v.hellow();
        dao.inputYear(v.inputYear());
        dao.inputMonth(v.inputMonth());
        v.showWorkCalendar(dao.getWorkCalendar());
        v.showRelaxDay(dao.relaxdaycount);
        v.showRelaxWeekends(dao.relaxweekendscount);
    }
}

测试结果

在这里插入图片描述


总结

大晚上赶出来的练手作,代码规范和功能实现肯定还有所不足。思路是把工作日历用StringBuffer字符串表示出来,折折腾腾总算是实现了(2月)。如何与日历头对齐是个大问题,\t多一个少一个呈现出来的结果截然不同,不得不说靠这玩意对齐是真的邪门。日后肯定还会有底层已实现功能,使用起来体验糟的一塌糊涂的情况吧。卖相还是很重要的。不知实际日历是如何实现。夯实基础,进军前端,问题肯定有所改善。
也没讲什么需求分析总体设计勘误注释查漏补缺。

碎碎念。
共勉

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值