输入时间,找出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
- 分析
周一到周五下午15点前都可看做同种
时间段:0-8(直接到11点) 8-9(小时上加3小时)9(9点特别注意) 9-12(小时上加5小时)12-14(直接到17点整) 14-15(小时上加3小时)15(15点特别注意) 15-18(小时上-7 天数+1) 18-23(天数+1 直接到11点整)
周五下午15:00:00-18:00:00(天+3 小时-7) 18后(天数+3 直接到11点整)
周六 周天 在天数上加到星期一
下面是代码
public class TestDome {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E");
System.out.println("请输入时间:yyyy-MM-dd HH:mm:ss");
String minDate="1900-01-01 00:00:00";
String maxDate="2050-01-01 00:00:00";
Scanner scanner=new Scanner(System.in);
String date=scanner.nextLine();
long min=sdf.parse(minDate).getTime();
long max=sdf.parse(maxDate).getTime();
long dateTime=sdf.parse(date).getTime();
Date date1=new Date(dateTime);
System.out.print(sdf.format(date1)+"("+simpleDateFormat.format(date1)+")");
if (dateTime<min||dateTime>max){
System.out.println("不再范围");
}else{
Date time=new Date(dateTime);
Calendar calendar=Calendar.getInstance();
calendar.setTime(time);
int weekday=calendar.get(Calendar.DAY_OF_WEEK)-1;
int hours=calendar.get(Calendar.HOUR_OF_DAY);
if (weekday==6){
dateTime=dateTime+2*24*60*60*1000;
time.setTime(dateTime);
calendar.setTime(time);
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),11,0,0);
}else if (weekday==0){
dateTime=dateTime+24*60*60*1000;
time.setTime(dateTime);
calendar.setTime(time);
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),11,0,0);
}else {
if (weekday==5&&hours>=18){
dateTime=dateTime+3*24*60*60*1000;
time.setTime(dateTime);
calendar.setTime(time);
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),11,0,0);
}else if (weekday==5&&(hours>15&&hours<18||hours==15&&calendar.get(Calendar.MINUTE)>0||hours==15&&calendar.get(Calendar.SECOND)>0)){
dateTime=dateTime+3*24*60*60*1000;
time.setTime(dateTime);
calendar.setTime(time);
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),hours-7,calendar.get(Calendar.MINUTE),calendar.get(Calendar.SECOND));
}else if (hours<8){
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),11,0,0);
} else if (hours>=8&&hours<9||hours==9&&calendar.get(Calendar.MINUTE)==0&&calendar.get(Calendar.SECOND)==0) {
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),hours+3,calendar.get(Calendar.MINUTE),calendar.get(Calendar.SECOND));
}else if (hours>9&&hours<12||hours==9&&calendar.get(Calendar.MINUTE)>0||hours==9&&calendar.get(Calendar.SECOND)>0) {
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),hours+5,calendar.get(Calendar.MINUTE),calendar.get(Calendar.SECOND));
}else if (hours>=12&&hours<14){
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),17,0,0);
}else if (hours>=14&&hours<15||hours==15&&calendar.get(Calendar.MINUTE)==0&&calendar.get(Calendar.SECOND)==0) {
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),hours+3,calendar.get(Calendar.MINUTE),calendar.get(Calendar.SECOND));
}else if (hours>15&&hours<18||hours==15&&calendar.get(Calendar.MINUTE)>0||hours==15&&calendar.get(Calendar.SECOND)>0) {
dateTime=dateTime+24*60*60*1000;
time.setTime(dateTime);
calendar.setTime(time);
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),hours-7,calendar.get(Calendar.MINUTE),calendar.get(Calendar.SECOND));
}else if (hours>=18){
dateTime=dateTime+24*60*60*1000;
time.setTime(dateTime);
calendar.setTime(time);
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),11,0,0);
}
}
System.out.println("三小时后工作时间为:"+sdf.format(calendar.getTime()));
}
}
}
测试结果
1899-01-01 00:12:23(星期日)不再范围
2051-01-01 00:00:00(星期日)不再范围
2020-11-30 07:00:00(星期一)三小时后工作时间为:2020-11-30 11:00:00
2020-11-30 08:00:00(星期一)三小时后工作时间为:2020-11-30 11:00:00
2020-11-30 08:01:01(星期一)三小时后工作时间为:2020-11-30 11:01:01
2020-11-30 09:00:00(星期一)三小时后工作时间为:2020-11-30 12:00:00
2020-11-30 09:00:01(星期一)三小时后工作时间为:2020-11-30 14:00:01
2020-11-30 09:01:00(星期一)三小时后工作时间为:2020-11-30 14:01:00
2020-11-30 09:01:01(星期一)三小时后工作时间为:2020-11-30 14:01:01
2020-11-30 12:00:00(星期一)三小时后工作时间为:2020-11-30 17:00:00
2020-11-30 12:00:01(星期一)三小时后工作时间为:2020-11-30 17:00:00
2020-11-30 12:01:01(星期一)三小时后工作时间为:2020-11-30 17:00:00
2020-11-30 14:00:00(星期一)三小时后工作时间为:2020-11-30 17:00:00
2020-11-30 14:01:01(星期一)三小时后工作时间为:2020-11-30 17:01:01
2020-11-30 15:00:00(星期一)三小时后工作时间为:2020-11-30 18:00:00
2020-11-30 15:00:01(星期一)三小时后工作时间为:2020-12-01 08:00:01
2020-11-30 15:01:00(星期一)三小时后工作时间为:2020-12-01 08:01:00
2020-11-30 17:58:57(星期一)三小时后工作时间为:2020-12-01 10:58:57
2020-11-30 18:00:00(星期一)三小时后工作时间为:2020-12-01 11:00:00
2020-11-30 18:00:01(星期一)三小时后工作时间为:2020-12-01 11:00:00
根据代码周一到周五15:00:00之前与周一测试用例同上
2020-12-04 14:00:00(星期五)三小时后工作时间为:2020-12-04 17:00:00
2020-12-04 15:00:00(星期五)三小时后工作时间为:2020-12-04 18:00:00
2020-12-04 15:00:01(星期五)三小时后工作时间为:2020-12-07 08:00:01
2020-12-04 15:01:00(星期五)三小时后工作时间为:2020-12-07 08:01:00
2020-12-04 18:00:01(星期五)三小时后工作时间为:2020-12-07 11:00:00
2020-12-05 05:23:23(星期六)三小时后工作时间为:2020-12-07 11:00:00
2020-12-05 12:23:23(星期六)三小时后工作时间为:2020-12-07 11:00:00
2020-12-05 18:23:23(星期六)三小时后工作时间为:2020-12-07 11:00:00
2020-12-06 05:23:23(星期日)三小时后工作时间为:2020-12-07 11:00:00
2020-12-06 10:23:23(星期日)三小时后工作时间为:2020-12-07 11:00:00
2020-12-06 19:23:23(星期日)三小时后工作时间为:2020-12-07 11:00:00
java.text.ParseException: Unparseable date: “2020-12- 0:0:0”
java.text.ParseException: Unparseable date: “2020-10-10 0:0”