记录一道“神奇“的面试题

题目:

输入时间,找出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

!!!!把各种题目可能出现异常的测试用例情况,保存到代码后面!!!!

//代码写在后面,写完后,点击左上角保存按钮,提示 “保存成功” 即可
//如果没提示保存成功,需要把 “名字” , 复制到#后面,并刷新页面

//请确认代码正确,不能出现运行报错

代码

package com.dao;

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

public class QuestionTwo {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String date_str = in.nextLine();

		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		Date date = null;
		try {
			date = dateFormat.parse(date_str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);

		Calendar result = Calendar.getInstance();
		// 一、把所有的在休息的时间都计算完事
		// 1.判断是否在周一8点前 ,周六0点以后
		// 获取本周一早8点的时间
		Calendar current_mon = Calendar.getInstance();
		initCalendar(current_mon, calendar);
		current_mon.set(Calendar.HOUR_OF_DAY, 8);
		int day;
		if (calendar.get(Calendar.DAY_OF_WEEK) == 7 || calendar.get(Calendar.DAY_OF_WEEK) == 1)
			day = (9 - calendar.get(Calendar.DAY_OF_WEEK)) % 7;
		else
			day = 2 - calendar.get(Calendar.DAY_OF_WEEK);
		current_mon.set(current_mon.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + day);
		// System.out.println(dateFormat.format(current_mon.getTime()));
		// 本周六0点
		Calendar current_sat = Calendar.getInstance();
		initCalendar(current_sat, calendar);
		current_sat.set(Calendar.HOUR_OF_DAY, 0);
		day = calendar.get(Calendar.DAY_OF_WEEK) % 7;
		current_sat.set(current_sat.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - day);
		// System.out.println(dateFormat.format(current_sat.getTime()));
		// 2.判断是否在当天的0点到8点之间
		// 获得当天早上0点的时间
		Calendar crrunt_morn_0 = Calendar.getInstance();
		initCalendar(crrunt_morn_0, calendar);

		// 获得当天早上8点的时间
		Calendar crrunt_morn_8 = Calendar.getInstance();
		initCalendar(crrunt_morn_8, calendar);
		crrunt_morn_8.set(Calendar.HOUR_OF_DAY, 8);
		// 3.判断是否在中午12:00到 2点
		// 获得当天中午12点的时间
		Calendar noon_12 = Calendar.getInstance();
		initCalendar(noon_12, calendar);
		noon_12.set(Calendar.HOUR_OF_DAY, 12);
		// 获得当天中午两点的时间
		Calendar noon_2 = Calendar.getInstance();
		initCalendar(noon_2, calendar);
		noon_2.set(Calendar.HOUR_OF_DAY, 14);

		// 4.判断是否在下午18点到第二天0点(周一到周四这样判断,周五走1的流程)
		// 获得当天下午18点的时间
		Calendar after_18 = Calendar.getInstance();
		initCalendar(after_18, calendar);
		after_18.set(Calendar.HOUR_OF_DAY, 18);
		// 获得第二天早上0点的时间
		Calendar tro_morn_0 = Calendar.getInstance();
		initCalendar(tro_morn_0, calendar);
		tro_morn_0.set(tro_morn_0.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
		// 获得第二天早上8点的时间
		Calendar tro_morn_8 = Calendar.getInstance();
		deepCopyCalendar(tro_morn_8, crrunt_morn_8);
		tro_morn_8.set(tro_morn_8.DAY_OF_MONTH, crrunt_morn_8.get(Calendar.DAY_OF_MONTH) + 1);

		// 5.判断是否在周五18点到下周六0点
		// 得到本一个周五18点的日期
		Calendar fri = Calendar.getInstance();
		initCalendar(fri, calendar);
		fri.set(Calendar.HOUR_OF_DAY, 18);
		day = 6 - calendar.get(Calendar.DAY_OF_WEEK);
		fri.set(fri.DAY_OF_MONTH, fri.get(Calendar.DAY_OF_MONTH) + day);

		// 得到下周六0点的时间
		Calendar next_sat = Calendar.getInstance();
		QuestionTwo.deepCopyCalendar(next_sat, current_sat); // 得用深拷贝
		next_sat.set(next_sat.DAY_OF_MONTH, next_sat.get(Calendar.DAY_OF_MONTH) + 7);

		// 得到下一个周一的日期
		Calendar next_mon = Calendar.getInstance();
		QuestionTwo.deepCopyCalendar(next_mon, current_mon);
		next_mon.set(next_mon.DAY_OF_MONTH, next_mon.get(Calendar.DAY_OF_MONTH) + 7);

		// 二.三种时间加不满的情况 (为了严格好算 接下来全用秒做单位)

		int Time_s = 3 * 60 * 60;// 三小时一共这么多秒
		// 1.上午不够 加到下午 下午不够加到第二天 这周不够 加到下周

		// 三、其他情况直接加就行
		// 获得当天早上8点的时间
		Calendar morn_8 = Calendar.getInstance();
		initCalendar(morn_8, calendar);
		morn_8.set(Calendar.HOUR_OF_DAY, 8);

		// 开始判断
		long cal_timeMill = calendar.getTimeInMillis();
		long current_mon_timeMill = current_mon.getTimeInMillis();
		long current_sat_timeMill = current_sat.getTimeInMillis();
		long crrunt_morn_8_timeMill = crrunt_morn_8.getTimeInMillis();
		long crrunt_morn_0_timeMill = crrunt_morn_0.getTimeInMillis();
		long noon_2_timeMill = noon_2.getTimeInMillis();
		long noon_12_timeMill = noon_12.getTimeInMillis();
		long tro_morn_0_timeMill = tro_morn_0.getTimeInMillis();
		long after_18_timeMill = after_18.getTimeInMillis();
		long next_sat_timeMill = next_sat.getTimeInMillis();
		long fri_timeMill = fri.getTimeInMillis();
		long morn_8_timeMill = morn_8.getTimeInMillis();

		if (cal_timeMill < current_mon_timeMill && cal_timeMill >= current_sat_timeMill) {
			// System.out.println("这种直接周一加3个点");
			QuestionTwo.deepCopyCalendar(result, current_mon);
			result.set(result.HOUR_OF_DAY, result.get(Calendar.HOUR_OF_DAY) + 3);
		} else if (cal_timeMill < crrunt_morn_8_timeMill && cal_timeMill >= crrunt_morn_0_timeMill) {
			 //System.out.println("这种直接当天早上加3个点");
			QuestionTwo.deepCopyCalendar(result, crrunt_morn_8);
			result.set(result.HOUR_OF_DAY, result.get(Calendar.HOUR_OF_DAY) + 3);
		} else if (cal_timeMill < noon_2_timeMill && cal_timeMill >= noon_12_timeMill) {
			// System.out.println("这种直接下午加3个点");
			QuestionTwo.deepCopyCalendar(result, noon_2);
			result.set(result.HOUR_OF_DAY, result.get(Calendar.HOUR_OF_DAY) + 3);
		} else if (calendar.get(Calendar.DAY_OF_WEEK) != 6 && cal_timeMill < tro_morn_0_timeMill && cal_timeMill >= after_18_timeMill) {
			// System.out.println("这种直接第二天早上加3个点");
			QuestionTwo.deepCopyCalendar(result, tro_morn_8);
			result.set(result.HOUR_OF_DAY, result.get(Calendar.HOUR_OF_DAY) + 3);
		} else if (calendar.get(Calendar.DAY_OF_WEEK) == 6 && cal_timeMill < next_sat_timeMill && cal_timeMill >= fri_timeMill) {
			 //System.out.println("这种直接下周一早上加3个点");
			QuestionTwo.deepCopyCalendar(result, next_mon);
			result.set(result.HOUR_OF_DAY, result.get(Calendar.HOUR_OF_DAY) + 3);
		} else if (cal_timeMill < noon_12_timeMill && cal_timeMill >= morn_8_timeMill
				&& (int) (noon_12_timeMill / 1000 - cal_timeMill / 1000) < Time_s) {
			// System.out.println("下午加上差的");
			QuestionTwo.deepCopyCalendar(result, noon_2);
			int time = (int) (Time_s - ((noon_12_timeMill / 1000) - (cal_timeMill / 1000)));
			result.set(result.SECOND, result.get(Calendar.SECOND) + time);
		} else if (calendar.get(Calendar.DAY_OF_WEEK) != 6 && cal_timeMill < after_18_timeMill && cal_timeMill >= noon_2_timeMill && ((after_18_timeMill / 1000) - (cal_timeMill / 1000)) < Time_s) {
			// System.out.println("第二天早上加上差的");
			QuestionTwo.deepCopyCalendar(result, tro_morn_8);
			int time = (int) (Time_s - ((after_18_timeMill / 1000) - (cal_timeMill / 1000)));
			result.set(result.SECOND, result.get(Calendar.SECOND) + time);
		} else if (calendar.get(Calendar.DAY_OF_WEEK) == 6 && cal_timeMill < after_18_timeMill && cal_timeMill >= noon_2_timeMill && ((after_18_timeMill / 1000) - (cal_timeMill / 1000)) < Time_s) {
			// System.out.println("下周一早上加上差的");
			QuestionTwo.deepCopyCalendar(result, next_mon);
			int time = (int) (Time_s - ((after_18_timeMill / 1000) - (cal_timeMill / 1000)));
			result.set(result.SECOND, result.get(Calendar.SECOND) + time);
		} else {
			// System.out.println("剩下的直接加");
			QuestionTwo.deepCopyCalendar(result, calendar);
			result.set(result.SECOND, result.get(Calendar.SECOND) + Time_s);
		}

		System.out.println(dateFormat.format(result.getTime()));
		in.close();
	}

	// 深拷贝 两个日期的值
	public static void deepCopyCalendar(Calendar calendar, Calendar calendar2) {
		calendar.set(Calendar.HOUR_OF_DAY, calendar2.get(Calendar.HOUR_OF_DAY));
		calendar.set(Calendar.MINUTE, calendar2.get(Calendar.MINUTE));
		calendar.set(Calendar.SECOND, calendar2.get(Calendar.SECOND));
		calendar.set(Calendar.MILLISECOND, calendar2.get(Calendar.MILLISECOND));
		calendar.set(calendar.YEAR, calendar2.get(Calendar.YEAR));
		calendar.set(calendar.MONTH, calendar2.get(Calendar.MONTH));
		calendar.set(calendar.DAY_OF_MONTH, calendar2.get(Calendar.DAY_OF_MONTH));

	}

	// 初始化当天的时间
	public static void initCalendar(Calendar calendar, Calendar calendar2) {
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		calendar.set(calendar.YEAR, calendar2.get(Calendar.YEAR));
		calendar.set(calendar.MONTH, calendar2.get(Calendar.MONTH));
		calendar.set(calendar.DAY_OF_MONTH, calendar2.get(Calendar.DAY_OF_MONTH));

	}
}

测试用例

我考虑的一些测试用例

<!--测试用例 -->
1.周六0点到周一早上8点前
1.1
输入:2020-11-14 00:00:00
输出:2020-11-16 11:00:00
1.2
输入:2020-11-14 11:12:13
输出:2020-11-16 11:00:00
1.3
输入:2020-11-15 11:12:13
输出:2020-11-16 11:00:00
1.4
输入:2020-11-16 07:12:13
输出:2020-11-16 11:00:00
2.早上0点到早上82.1
输入:2020-11-16 07:12:13
输出:2020-11-16 11:00:00
2.2
输入:2020-11-17 07:12:13
输出:2020-11-17 11:00:00
2.3
输入:2020-11-15 07:12:13
输出:2020-11-16 11:00:00
3.中午12点到143.1
输入:2020-11-16 12:12:13
输出:2020-11-16 17:00:00
3.2
输入:2020-11-17 12:12:13
输出:2020-11-17 17:00:00
3.3
输入:2020-11-20 12:12:13
输出:2020-11-20 17:00:00
4.下午18点到第二天04.1
输入:2020-11-20 18:12:13
输出:2020-11-23 11:00:00
4.2
输入:2020-11-19 18:12:13
输出:2020-11-20 11:00:00
5.本周五18点到下一周周六05.1
输入:2020-11-20 18:12:13
输出:2020-11-23 11:00:00

6.上午时间不够,加到下午
6.1
输入:2020-11-16 11:12:13
输出:2020-11-16 16:12:13
6.2
输入:2020-11-20 11:12:13
输出:2020-11-20 16:12:13

7.下午时间不够,加到第二天早上
7.1
输入:2020-11-16 17:12:13
输出:2020-11-17 10:12:13
7.2
输入:2020-11-17 17:12:13
输出:2020-11-18 10:12:13
8.本周时间不够,加到下一周 同5
9.跨月
9.1
输入:2020-11-30 17:12:13
输出:2020-12-01 10:12:13

10跨年
输入:2020-12-31 17:12:13
输出:2021-01-01 10:12:13

总结

考虑问题要全面

吐槽

(作为面试题不知道在考察什么,猜测是考耐心!!!)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值