public static long getSpanHour(String string_time_in, String string_time_out, String string_free_start, String string_free_end) { try { // 包含的完整的免费时段次数 int span_times = 0; // 跨天停车标识符 boolean dayFlag = false; String date = string_time_in.substring(0, 10); string_free_start = date + " " + string_free_start; string_free_end = date + " " + string_free_end; // 驶入时间 Timestamp time_in = Timestamp.valueOf(string_time_in); // 驶出时间 Timestamp time_out = Timestamp.valueOf(string_time_out); long span_hour = (time_out.getTime() - time_in.getTime()) / (60 * 60 * 1000); // 超时停车标识符 boolean overFlag = false; if ((time_out.getTime() - time_in.getTime()) % (60 * 60 * 1000) / (60 * 1000) > 5) { overFlag = true; } // 免费停车标识符 boolean free = false; // 免费时段开始 Timestamp free_start = Timestamp.valueOf(string_free_start); // 免费时段结束 Timestamp free_end = Timestamp.valueOf(string_free_end); // 免费时段时长(小时) long span_free_hour = (free_end.getTime() - free_start.getTime()) / (60 * 60 * 1000) + 24; // 停车时间超过24小时,跨天停车标识符为true,减去一个免费时段时长 long boundary = span_hour; while (boundary >= 24) { boundary -= 24; span_times++; dayFlag = true; } span_hour = span_hour - span_times * span_free_hour; // 时间转化为同一天进行计算剩余时长 time_in.setYear(time_out.getYear()); time_in.setMonth(time_out.getMonth()); time_in.setDate(time_out.getDate()); free_start.setYear(time_out.getYear()); free_start.setMonth(time_out.getMonth()); free_start.setDate(time_out.getDate()); free_end.setYear(time_out.getYear()); free_end.setMonth(time_out.getMonth()); free_end.setDate(time_out.getDate()); if (time_in.before(free_end) || time_in.after(free_start)) {// 免费时段驶入 if (time_out.before(free_end) || time_out.after(free_start)) {// 免费时段驶出 overFlag = false; if (dayFlag) {// 跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 span_hour -= (time_out.getTime() - time_in.getTime()) / (60 * 60 * 1000); } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 span_hour -= 24 - Math.ceil((time_in.getTime() - time_out.getTime()) / (60.0 * 60 * 1000)); } else { // do nothing } } else {// 非跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 span_hour = 0; free = true; } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 span_hour -= span_free_hour; } else { // do nothing } } } else {// 非免费时段驶出 if((time_out.getTime() - free_end.getTime()) % (60 * 60 * 1000) / (60 * 1000) <= 5) { overFlag = false; } if (dayFlag) {// 跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 span_hour -= (free_end.getTime() - time_in.getTime()) / (60 * 60 * 1000); } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 span_hour -= 24 - (time_in.getTime() - free_end.getTime()) / (60 * 60 * 1000); } } else {// 非跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 span_hour -= (free_end.getTime() - time_in.getTime()) / (60 * 60 * 1000); } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 span_hour -= 24 - (time_in.getTime() - free_end.getTime()) / (60 * 60 * 1000); } } } } else {// 非免费时段驶入 if (time_out.before(free_end) || time_out.after(free_start)) {// 免费时段驶出 if (dayFlag) {// 跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 span_hour -= (time_out.getTime() - free_start.getTime()) / (60 * 60 * 1000); } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 // do nothing } } else {// 非跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 span_hour -= (time_out.getTime() - free_start.getTime()) / (60 * 60 * 1000); } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 // do nothing } } } else {// 非免费时段驶出 if (dayFlag) {// 跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 // do nothing } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 span_hour -= 24 - ((time_in.getTime() - time_out.getTime()) / (60 * 60 * 1000)); span_hour += (free_start.getTime() - time_in.getTime()) / (60 * 60 * 1000); span_hour += (time_out.getTime() - free_end.getTime()) / (60 * 60 * 1000); } } else {// 非跨天停车 if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前 // do nothing } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后 // do nothing } } } } // 超过5分钟按一小时 if (overFlag) { span_hour++; } if (free || span_hour < 0) { span_hour = 0; } return span_hour; } catch (Exception exception) { exception.printStackTrace(); } return 0; }