Java找到休息日问题

Java找到休息日问题

核心知识

日历类:Calendar
时间类:SimpleDateFormat、Date
集合类:ArrayList
字符串类:StringBuilder(不安全的)

问题描述:

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

效果图:在这里插入图片描述

源码

不多bb直接给出源码,超全注释


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Demo4 {
    public static void main(String[] args) throws ParseException {
        System.out.println("请输入年:");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        System.out.println("请输入月:");
        int month = scanner.nextInt();
        //创建一个当前日历
        Calendar calendar = new GregorianCalendar();
        //设置年
        calendar.set(Calendar.YEAR,year);
        //设置月(0-11月)
        calendar.set(Calendar.MONTH,month-1);

        System.out.print("星期日  星期一  星期二  星期三  星期四  星期五  星期六");

        //创建一个集合用来存储该日历
        List<String> arr = new ArrayList<>();
        //设置日期为1
        //获取该时间是星期几,星期日为1
        calendar.set(Calendar.DATE,1);
        int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
        //根据星期几给日历集合加多少个空格
        for (int z=0; z<weekDay ;z++) {
            arr.add("    ");
        }
        //统计该月有多少天休息
        int count = 0;
        int weekcount = 0;
        //获取日历当月最大日期
        int maxDate = calendar.getActualMaximum(Calendar.DATE);
        for (int i=1; i<=maxDate; i++) {
            //设置日期为1-最大日期
            calendar.set(Calendar.DATE,i);

            //把日期拼接成一个字符串
            int a = calendar.get(Calendar.YEAR);
            String b = String.valueOf(calendar.get(Calendar.MONTH+1));
            String c = String.valueOf(calendar.get(Calendar.DATE));
            if (calendar.get(Calendar.MONTH+1) < 10) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(b);
                b = stringBuilder.toString();
            }
            if (calendar.get(Calendar.DATE) < 10){
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(c);
                c = stringBuilder.toString();
            }
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(a);
            stringBuilder.append(b);
            stringBuilder.append(c);
            //创建一个时间
            String date = stringBuilder.toString();

            //创建一个时间格式
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
            //把字符串转为时间格式
            Date d = simpleDateFormat.parse(date);
            //把时间,格式化为想要的格式
            SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日");
            String time = simpleDateFormat1.format(d);

            //获取该日期
            int day = calendar.get(Calendar.DATE);
            //把日期转化为字符串
            String newDay = String.valueOf(day);
            //如果是休息日,则加个[]
            if (workDay(time)) {
                //StringBuilder节省内存
                StringBuilder stringBuilder1 = new StringBuilder();
                stringBuilder1.append("[");
                stringBuilder1.append(newDay);
                stringBuilder1.append("]");
                newDay = stringBuilder1.toString();
                //统计休息天数
                count++;
                //是周日的休息天数
                if (calendar.get(Calendar.DAY_OF_WEEK)==1 || calendar.get(Calendar.DAY_OF_WEEK)==7){
                    weekcount++;
                }
            }else {
                StringBuilder stringBuilder1 = new StringBuilder();
                stringBuilder1.append(" ");
                stringBuilder1.append(newDay);
                stringBuilder1.append(" ");
                newDay = stringBuilder1.toString();
            }
            if (day<10) {
                StringBuilder stringBuilder1 = new StringBuilder();
                stringBuilder1.append(" ");
                stringBuilder1.append(newDay);
                newDay = stringBuilder1.toString();
            }
            arr.add(newDay);
        }

        //打印集合
        for (int j=0; j<arr.size(); j++) {
            //如果有7个数就换行
            System.out.print(arr.get(j)+"   ");
            if (j%7==0){
                System.out.println();
            }
        }

        //统计本月有多少天休息天,多少天是周末
        System.out.println();
        System.out.println("本月休息天数有"+count+"天");
        System.out.println("本月轮到周末的休息天数是"+weekcount+"天");


    }
    //写一个方法:从2020年2月2日开始,每三天返回一个true代表是休息日
    static boolean workDay(String input) throws ParseException {
        //创建一个当前日历,可以修改
        Calendar calendar = new GregorianCalendar();
        //设置年
        calendar.set(Calendar.YEAR,2020);
        //设置月(0-11月)
        calendar.set(Calendar.MONTH,1);
        //设置日期
        calendar.set(Calendar.DATE,2);

        //创建一个集合用于存放休息日的时间
        List<String> list = new ArrayList<>();

        //i为休息日数量,可以随便调
        for (int i=0; i<1000; i++) {
            //把日期拼接成一个字符串
            //把日期拼接成一个字符串
            int a = calendar.get(Calendar.YEAR);
            String b = String.valueOf(calendar.get(Calendar.MONTH+1));
            String c = String.valueOf(calendar.get(Calendar.DATE));
            if (calendar.get(Calendar.MONTH+1) < 10) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(b);
                b = stringBuilder.toString();
            }
            if (calendar.get(Calendar.DATE) < 10){
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("0");
                stringBuilder.append(c);
                c = stringBuilder.toString();
            }
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(a);
            stringBuilder.append(b);
            stringBuilder.append(c);
            //创建一个时间
            String date = stringBuilder.toString();
            //创建一个时间格式
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
            //把字符串转为时间格式
            Date d = simpleDateFormat.parse(date);
            //把时间,格式化为想要的格式
            SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日");
            String time = simpleDateFormat1.format(d);
            //该日期是休息日存入集合中
            list.add(time);

            //使日历的日期不断累加4,每4天休息一次,可以修改
            calendar.add(Calendar.DATE,4);
        }
        //判断输入的字符串是否在集合中,在就返回true
        return list.contains(input);
    }
}

补充

如果想要给不同的人使用这个程序,可以把workDay()方法作为一个类,用户自己输入首次休息日,以及多少天为一个休息日。
输入年月没有处理输入异常,可以补充上去。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值