输入时间,找出3小时后的工作时间点,如果遇到休息时间,需要跳过(就是休息时间不计时),

输入时间,找出3小时后的工作时间点,如果遇到休息时间,需要跳过(就是休息时间不计时),输入时间格式:2020-03-21 14:23:31
输入时间范围:1900-01-01 00:00:00,2050-01-01 00:00:00
工作时间:周一至周五,上午8:00至12:00,下午2:00,至18:00

!!!!请注意题目各种情况 !!!!

测试用例如:
输入2020-03-20 14:23:31(星期五), 返回 2020-03-20 17:23:31
输入2020-03-20 05:23:31(星期五), 返回 2020-03-20 11:00:00

!!!!把各种题目可能出现异常的测试用例情况

思路就是:先从输入方法,判断范围方法,时间的算法(星期几的算法)一步一步做的,难点就是时间那一块,需要考虑的情况很多,首先就是设置if语句判断是否是星期五,星期六,星期天,如果属于这三天中的一个,需要另外条件判断,如果不属于,那就跳过判断日期的if语句,直接进入时间点的if语句判断。后面又根据测试用例每个时间点测试,完善代码。

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

public class Test02 {
    public static void main(String[] args) {
        SimpleDateFormat sdf = null;
        try {
            sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            dateSystem("请输入时间,格式为:2020-03-21 14:23:31", sdf);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    private static void dateRange(String str, SimpleDateFormat sdf) throws ParseException {
        //输入时间
        long time = sdf.parse(str).getTime();
        //规定时间范围
        long loTime = sdf.parse("1900-01-01 00:00:00").getTime();
        long hiTime = sdf.parse("2050-01-01 00:00:00").getTime();
        //判断
        if (time <= hiTime && loTime <= time) {
            long newTime = time;
            algTime(newTime, sdf);
        } else {
            dateSystem("超过规定范围,请重新输入(时间范围:1900-01-01 00:00:00,2050-01-01 00:00:00)", sdf);
        }

    }

    //时间算法
    private static void algTime(long newTime, SimpleDateFormat sdf) {
        Date date = new Date(newTime);
        int hours = date.getHours();
        //获取是周几
        String dayOfWeek = getWeek(date, sdf);
        //判断
        long time = date.getTime();
        if ("星期六".equals(dayOfWeek)) {
            time = time + 2 * 24 * 60 * 60 * 1000;
            date.setTime(time);
            date.setHours(11);
            date.setMinutes(00);
            date.setSeconds(00);
            System.out.println("3小时后的工作时间点:" + sdf.format(date));
        } else if ("星期日".equals(dayOfWeek)) {
            time = time + 24 * 60 * 60 * 1000;
            date.setTime(time);
            date.setHours(11);
            date.setMinutes(00);
            date.setSeconds(00);
            System.out.println("3小时后的工作时间点:" + sdf.format(date));
        } else {
            if ("星期五".equals(dayOfWeek)) {
                if (hours >=18) {
                    time = time + 3 * 24 * 60 * 60 * 1000;
                    date.setTime(time);
                    date.setHours(11);
                    date.setMinutes(00);
                    date.setSeconds(00);
                    System.out.println("3小时后的工作时间点:" + sdf.format(date));
                    System.exit(0);
                } else if (15 < hours && hours < 18) {
                    time = time + 3 * 24 * 60 * 60 * 1000;
                    date.setTime(time);
                    date.setHours(hours - 7);
                    System.out.println("3小时后的工作时间点:" + sdf.format(date));
                    System.exit(0);
                }
            }
            if (hours < 8) {
                date.setHours(11);
                date.setMinutes(00);
                date.setSeconds(00);
                System.out.println("3小时后的工作时间点:" + sdf.format(date));
            } else if (hours >= 8 && hours < 9||hours==9&&date.getMinutes()==0&&date.getSeconds()==0) {
                date.setHours(hours + 3);
                System.out.println("3小时后的工作时间点:" + sdf.format(date));
            } else if (hours > 9 && hours < 12||hours==9&&date.getMinutes()>0||hours==9&&date.getSeconds()>0) {
                date.setHours(5+hours);
                System.out.println("3小时后的工作时间点:" + sdf.format(date));
            } else if (12 <= hours && hours < 14) {
                date.setHours(17);
                date.setMinutes(00);
                date.setSeconds(00);
                System.out.println("3小时后的工作时间点:" + sdf.format(date));
            } else if (14 <= hours && hours <15||hours==15&&date.getMinutes()==0&&date.getSeconds()==0) {
                date.setHours(hours + 3);
                System.out.println("3小时后的工作时间点:" + sdf.format(date));
            } else if (15 < hours && hours < 18||hours==15&&date.getMinutes()>0||hours==15&&date.getSeconds()>0) {
                time = time + 24 * 60 * 60 * 1000;
                date.setTime(time);
                date.setHours(hours - 7);
                System.out.println("3小时后的工作时间点:" + sdf.format(date));
            } else if (hours >= 18) {
                time = time + 24 * 60 * 60 * 1000;
                date.setTime(time);
                date.setHours(11);
                date.setMinutes(00);
                date.setSeconds(00);
                System.out.println("3小时后的工作时间点:" + sdf.format(date));
            }
        }
    }
    //输入时间方法
    private static void dateSystem(String string, SimpleDateFormat sdf) throws ParseException {
        Scanner sc = new Scanner(System.in);
        System.out.println(string);
        String date = sc.nextLine();
        dateRange(date, sdf);

    }

    //获取是星期几
    public static String getWeek(Date date, SimpleDateFormat sdf) {
        String format = sdf.format(date);
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = sdf.parse(format, pos);
        Calendar c = Calendar.getInstance();
        c.setTime(strtodate);
        return new SimpleDateFormat("E").format(c.getTime());
    }
}

写完后强烈建议测试代码是否把所有情况考虑到了,进一步完善代码

测试用例:
测试用例 输出结果
1899-01-01 00:00:00 超过规定范围,请重新输入(时间范围:1900-01-01 00:00:00,2050-01-01 00:00:00)
2051-01-01 00:00:00 超过规定范围,请重新输入(时间范围:1900-01-01 00:00:00,2050-01-01 00:00:00)
2020-11-16 05:37:55(星期一) 3小时后的工作时间点:2020-11-16 11:00:00
2020-11-16 08:00:00(星期一) 3小时后的工作时间点:2020-11-16 11:00:00
2020-11-16 08:37:55(星期一) 3小时后的工作时间点:2020-11-16 11:37:55
2020-11-16 09:00:00(星期一) 3小时后的工作时间点:2020-11-16 12:00:00
2020-11-16 09:01:00(星期一) 3小时后的工作时间点:2020-11-16 14:01:00
2020-11-16 09:00:01(星期一) 3小时后的工作时间点:2020-11-16 14:00:01
2020-11-16 12:00:00(星期一) 3小时后的工作时间点:2020-11-16 17:00:00
2020-11-16 13:59:00(星期一) 3小时后的工作时间点:2020-11-16 17:00:00
2020-11-16 14:00:00(星期一) 3小时后的工作时间点:2020-11-16 17:00:00
2020-11-16 14:59:23(星期一) 3小时后的工作时间点:2020-11-16 17:59:23
2020-11-16 15:00:00(星期一) 3小时后的工作时间点:2020-11-16 18:00:00
2020-11-16 15:01:00(星期一) 3小时后的工作时间点:2020-11-17 08:01:00
2020-11-16 15:00:01(星期一) 3小时后的工作时间点:2020-11-17 08:00:01
2020-11-16 18:00:00(星期一) 3小时后的工作时间点:2020-11-17 11:00:00
2020-11-16 18:30:00(星期一) 3小时后的工作时间点:2020-11-17 11:00:00
2020-11-16 24:00:00(星期一) 3小时后的工作时间点:2020-11-17 11:00:00
2020-11-16 00:00:00(星期一) 3小时后的工作时间点:2020-11-16 11:00:00
根据代码周一到周五15:00:00之前与周一测试用例相同
2020-11-20 15:00:00(星期五) 3小时后的工作时间点:2020-11-20 18:00:00
2020-11-20 15:00:01(星期五) 3小时后的工作时间点:2020-11-21 08:00:01
2020-11-20 18:00:00(星期五) 3小时后的工作时间点:2020-11-23 11:00:00
2020-11-20 18:30:00(星期五) 3小时后的工作时间点:2020-11-23 11:00:00
2020-11-20 24:00:00(星期五) 3小时后的工作时间点:2020-11-23 11:00:00
2020-11-21 00:00:00(星期六) 3小时后的工作时间点:2020-11-23 11:00:00
2020-11-21 12:00:00(星期六) 3小时后的工作时间点:2020-11-23 11:00:00
2020-11-28 12:00:01(星期六) 3小时后的工作时间点:2020-11-30 11:00:00
2020-11-22 00:00:00(星期天) 3小时后的工作时间点:2020-11-23 11:00:00
2020-11-22 15:34:00(星期天) 3小时后的工作时间点:2020-11-23 11:00:00
2020-11-29 12:34:01(星期天) 3小时后的工作时间点:2020-11-30 11:00:00
异常测试
2020-11-29 1 java.text.ParseException: Unparseable date: “2020-11-29 1”
2020-03-21 14:23:3 3小时后的工作时间点:2020-03-23 11:00:00(返回正确结果,格式不规范)
2020-03-21 14:23: java.text.ParseException: Unparseable date: “2020-03-21 14:23:”
2020-03-21 14:23 java.text.ParseException: Unparseable date: “2020-03-21 14:23”

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值