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