题目:
输入时间,找出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点到早上8点
2.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点到14点
3.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点到第二天0点
4.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点到下一周周六0点
5.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
总结
考虑问题要全面
吐槽
(作为面试题不知道在考察什么,猜测是考耐心!!!)