~~
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 工单耗时工具类
*/
public class TimeConsumingUtils {
// 设置上班时间:该处时间可以根据实际情况进行调整
int abh = 8; // 上午上班时间,小时
int abm = 30; // 上午上班时间,分钟
int aeh = 11; // 上午下班时间,小时
int aem = 30; // 上午下班时间,分钟
int pbh = 13; // 下午上班时间,小时
int pbm = 0; // 下午上班时间,分钟
int peh = 17; // 下午下班时间,小时
int pem = 30; // 下午下班时间,分钟
long m1 = abh * 60 + abm; // 上午上班时间总分钟数
long m2 = aeh * 60 + aem; // 上午下班时间总分钟数
long m3 = pbh * 60 + pbm; // 下午上班时间中分钟数
long m4 = peh * 60 + pem; // 下午下班时间总分钟数
long minutesPerDay = m2 - m1 + m4 - m3;// 每天上班分钟数
/**
* 判断输入的年月日日期是否属于休息日
*
* @param date
* 需要判断的日期(年月日)
* @param lawHolidayList
* 国家规定放假的时间
* @param lawWorkList
* 国家规定的工作日期
* @return
*/
public static boolean isDayOff(Date date, List<Date> lawHolidayList, List<Date> lawWorkList) {
for (Date date1 : lawHolidayList) {
int c = date.compareTo(date1);
if (c == 0) {
// 休息日
return true;
}
}
for (Date date1 : lawWorkList) {
int c = date.compareTo(date1);
if (c == 0) {
// 工作日
return false;
}
}
return isZhouLiuZhouRiDate(date);
}
/**
* 判断时间是否属于正常周六日
*
* @param date
* @return
*/
public static boolean isZhouLiuZhouRiDate(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.DAY_OF_WEEK) - 1;
// System.out.println("week=" + week);
// 是否属于周六日
boolean flag = (week == 0 || week == 6);
return flag;
}
/**
* 排除国家法定的休息日、正常周六日,计算两个时间相差多少小时数(休息日当天时间为零处理)
*
* @param startTimeYYYYMMDDHHMMSS
* 年月日时分秒
* @param endTimeYYYYMMDDHHMMSS
* 年月日时分秒
* @param lawHolidayList
* @param lawWorkList
* @return
*/
public long workHours(Date startTimeYYYYMMDDHHMMSS, Date endTimeYYYYMMDDHHMMSS, List<Date> lawHolidayList,
List<Date> lawWorkList) throws Exception {
if (endTimeYYYYMMDDHHMMSS.before(startTimeYYYYMMDDHHMMSS) || endTimeYYYYMMDDHHMMSS.compareTo(startTimeYYYYMMDDHHMMSS) == 0) {
return 0;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 开始时间转成年月日格式
String strStartTimeYYYYMMDD = sdf.format(startTimeYYYYMMDDHHMMSS);
Date startTimeYYYYMMDD = sdf.parse(strStartTimeYYYYMMDD);
// 开始时间是否属于休息日
boolean startTimeIsDayOff = isDayOff(startTimeYYYYMMDD, lawHolidayList, lawWorkList);
// 结束时间转成年月日格式
String strEndTimeYYYYMMDD = sdf.format(endTimeYYYYMMDDHHMMSS);
Date endTimeYYYYMMDD = sdf.parse(strEndTimeYYYYMMDD);
// 结束时间是否属于休息日
boolean endTimeIsDayOff = isDayOff(endTimeYYYYMMDD, lawHolidayList, lawWorkList);
// 分为4种情况
if (startTimeIsDayOff) {
if (!endTimeIsDayOff) {
System.out.println("开始时间在休息日里,结束时间不在休息日里");
// 开始时间在休息日里,结束时间不在休息日里(开始那天不计算小时数,结束那天计算小时数)
Calendar cal = Calendar.getInstance();
cal.setTime(startTimeYYYYMMDD);
cal.add(Calendar.DAY_OF_MONTH, +1);
Date validStartTimeYYYYMMDD = cal.getTime();
int workDays = 0;
// 循环遍历开始时间之后的每一个日期
while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
workDays += 1;
}
cal.add(Calendar.DAY_OF_MONTH, +1);
validStartTimeYYYYMMDD = cal.getTime();
}
System.out.println("工作整天数" + workDays);
// 结束时间的总分钟数
Calendar endCa = Calendar.getInstance();
endCa.setTime(endTimeYYYYMMDDHHMMSS);
long endMinutes = endCa.get(Calendar.HOUR_OF_DAY) * 60 + endCa.get(Calendar.MINUTE);
long endWorkMinutes = 0;
if (endMinutes < m1) {
endWorkMinutes = 0;
} else if (endMinutes >= m1 && endMinutes <= m2) {
endWorkMinutes = endMinutes - m1;
} else if (endMinutes > m2 && endMinutes < m3) {
endWorkMinutes = m2 - m1;
} else if (endMinutes >= m3 && endMinutes <= m4) {
endWorkMinutes = endMinutes - m1 - (m3 - m2);
} else {
endWorkMinutes = minutesPerDay;
}
System.out.println("结束时间的总分钟数" + endMinutes);
System.out.println("结束时间当天的工作总分钟数endWorkMinutes:" + endWorkMinutes);
return endWorkMinutes + workDays * minutesPerDay;
} else {
System.out.println("开始时间在休息日里,结束时间也在休息日里");
// 开始时间在休息日里,结束时间也在休息日里(开始那天不计算小时数,结束那天也不计算小时数,看中间有多少个工作日)
Calendar cal = Calendar.getInstance();
cal.setTime(startTimeYYYYMMDD);
cal.add(Calendar.DAY_OF_MONTH, +1);
Date validStartTimeYYYYMMDD = cal.getTime();
if (startTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) == 0) {
System.out.println("开始时间和结束时间在同一天,都为工作日");
return 0;
} else {
// 工作日天数
int workDays = 0;
// 循环遍历开始时间之后的每一个日期
while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
workDays += 1;
}
cal.add(Calendar.DAY_OF_MONTH, +1);
validStartTimeYYYYMMDD = cal.getTime();
}
System.out.println("工作整天数" + workDays);
return workDays * minutesPerDay;
}
}
} else {
if (endTimeIsDayOff) {
System.out.println("开始时间不在休息日里,结束时间在休息日里");
int workDays = 0; // 工作整天数
// 开始时间不在休息日里,结束时间在休息日里
Calendar cal = Calendar.getInstance();
cal.setTime(startTimeYYYYMMDD);
cal.add(Calendar.DAY_OF_MONTH, +1);
Date validStartTimeYYYYMMDD = cal.getTime();
while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
workDays += 1;
}
cal.add(Calendar.DAY_OF_MONTH, +1);
validStartTimeYYYYMMDD = cal.getTime();
}
System.out.println("工作整天数" + workDays);
Calendar startCa = Calendar.getInstance();
startCa.setTime(startTimeYYYYMMDDHHMMSS);
// 开始时间的总分钟数
long startMinutes = startCa.get(Calendar.HOUR_OF_DAY) * 60 + startCa.get(Calendar.MINUTE);
long startWorkMinutes = 0;
if (startMinutes < m1) {
startWorkMinutes = minutesPerDay;
} else if (startMinutes >= m1 && startMinutes <= m2) {
startWorkMinutes = m4 - startMinutes - (m3 - m2);
} else if (startMinutes > m2 && startMinutes < m3) {
startWorkMinutes = m4 - m3;
} else if (startMinutes >= m3 && startMinutes <= m4) {
startWorkMinutes = m4 - startMinutes;
} else {
startWorkMinutes = 0;
}
System.out.println("开始时间当天的工作总分钟数startWorkMinutes:" + startWorkMinutes);
// int startHour = ca.get(Calendar.HOUR_OF_DAY);
return startWorkMinutes + workDays * minutesPerDay;
} else {
System.out.println("开始时间不在休息日里,结束时间也不在休息日里");
// 开始时间不在休息日里,结束时间也不在休息日里
// 开始时间的总分钟数
Calendar startCa = Calendar.getInstance();
startCa.setTime(startTimeYYYYMMDDHHMMSS);
long startMinutes = startCa.get(Calendar.HOUR_OF_DAY) * 60 + startCa.get(Calendar.MINUTE);
long startWorkMinutes = 0;
// 结束时间的总分钟数
Calendar endCa = Calendar.getInstance();
endCa.setTime(endTimeYYYYMMDDHHMMSS);
long endMinutes = endCa.get(Calendar.HOUR_OF_DAY) * 60 + endCa.get(Calendar.MINUTE);
long endWorkMinutes = 0;
if (startTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) == 0) {
System.out.println("开始时间和结束时间在同一天,都为工作日");
if (startMinutes < m1) {
if (endMinutes < m1) {
return 0;
} else if (endMinutes >= m1 && endMinutes <= m2) {
return endMinutes - m1;
} else if (endMinutes > m2 && endMinutes < m3) {
return m2 - m1;
} else if (endMinutes >= m3 && endMinutes <= m4) {
return endMinutes - m1 - (m3 - m2);
} else {
return minutesPerDay;
}
} else if (startMinutes >= m1 && startMinutes <= m2) {
if (endMinutes >= m1 && endMinutes <= m2) {
return endMinutes - startMinutes;
} else if (endMinutes > m2 && endMinutes < m3) {
return m2 - startMinutes;
} else if (endMinutes >= m3 && endMinutes <= m4) {
return endMinutes - m3 + (m2 - startMinutes);
} else {
return m4 - m3 + (m2 - startMinutes);
}
} else if (startMinutes > m2 && startMinutes < m3) {
if (endMinutes > m2 && endMinutes < m3) {
return 0;
} else if (endMinutes >= m3 && endMinutes <= m4) {
return endMinutes - m3;
} else {
return m4 - m3;
}
} else if (startMinutes >= m3 && startMinutes <= m4) {
if (endMinutes >= m3 && endMinutes <= m4) {
return endMinutes - startMinutes;
} else {
return m4 - startMinutes;
}
} else {
return 0;
}
} else {
System.out.println("开始时间和结束时间不在同一天,都为工作日");
int workDays = 0; 工作整天数
Calendar cal = Calendar.getInstance();
cal.setTime(startTimeYYYYMMDD);
cal.add(Calendar.DAY_OF_MONTH, +1);
Date validStartTimeYYYYMMDD = cal.getTime();
while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
workDays += 1;
}
cal.add(Calendar.DAY_OF_MONTH, +1);
validStartTimeYYYYMMDD = cal.getTime();
}
System.out.println("工作整天数" + workDays);
if (startMinutes < m1) {
startWorkMinutes = minutesPerDay;
} else if (startMinutes >= m1 && startMinutes <= m2) {
startWorkMinutes = m4 - startMinutes - (m3 - m2);
} else if (startMinutes > m2 && startMinutes < m3) {
startWorkMinutes = m4 - m3;
} else if (startMinutes >= m3 && startMinutes <= m4) {
startWorkMinutes = m4 - startMinutes;
} else {
startWorkMinutes = 0;
}
System.out.println("开始时间当天的工作总分钟数startWorkMinutes:" + startWorkMinutes);
if (endMinutes < m1) {
endWorkMinutes = 0;
} else if (endMinutes >= m1 && endMinutes <= m2) {
endWorkMinutes = endMinutes - m1;
} else if (endMinutes > m2 && endMinutes < m3) {
endWorkMinutes = m2 - m1;
} else if (endMinutes >= m3 && endMinutes <= m4) {
endWorkMinutes = endMinutes - m1 - (m3 - m2);
} else {
endWorkMinutes = minutesPerDay;
}
System.out.println("结束时间的总分钟数" + endMinutes);
System.out.println("结束时间当天的工作总分钟数endWorkMinutes:" + endWorkMinutes);
return startWorkMinutes + endWorkMinutes + workDays * minutesPerDay;
}
}
}
}
/*public static void main(String args[]) throws Exception {
SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
List<Date> lawHolidayDate = new ArrayList<>();
List<Date> lawWorkDate = new ArrayList<>();
String[] lawHolidayDateStr = new String[] { "2019-01-01", "2019-02-04", "2019-02-05", "2019-02-06",
"2019-02-07", "2019-02-08", "2019-02-09", "2019-02-10", "2019-04-05", "2019-04-06", "2019-04-07",
"2019-05-01", "2019-05-02", "2019-05-03", "2019-05-04", "2019-06-07", "2019-06-08", "2019-06-09",
"2019-09-13", "2019-09-14", "2019-09-15", "2019-10-01", "2019-10-02", "2019-10-03", "2019-10-04",
"2019-10-05", "2019-10-06", "2019-10-07" };
String[] lawWorkDateStr = new String[] { "2019-02-02", "2019-02-03", "2019-04-28", "2019-05-05", "2019-09-29",
"2019-10-12" };
for (String str : lawHolidayDateStr) {
lawHolidayDate.add(yyyyMMdd.parse(str));
}
for (String str : lawWorkDateStr) {
lawWorkDate.add(yyyyMMdd.parse(str));
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDate = sdf.parse("2019-05-11 15:20:59");
Date endDate = sdf.parse("2019-05-13 15:20:59");
System.out.println("开始时间:" + sdf.format(startDate));
System.out.println("结束时间:" + sdf.format(endDate));
System.out.println("相差分钟数:" + workHours(startDate, endDate, lawHolidayDate, lawWorkDate));
}*/
public Long workMinutes(Date startDate,Date endDate) throws Exception {
SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
List<Date> lawHolidayDate = new ArrayList<>();
List<Date> lawWorkDate = new ArrayList<>();
String[] lawHolidayDateStr = new String[] { "2019-01-01", "2019-02-04", "2019-02-05", "2019-02-06",
"2019-02-07", "2019-02-08", "2019-02-09", "2019-02-10", "2019-04-05", "2019-04-06", "2019-04-07",
"2019-05-01", "2019-05-02", "2019-05-03", "2019-05-04", "2019-06-07", "2019-06-08", "2019-06-09",
"2019-09-13", "2019-09-14", "2019-09-15", "2019-10-01", "2019-10-02", "2019-10-03", "2019-10-04",
"2019-10-05", "2019-10-06", "2019-10-07" };
String[] lawWorkDateStr = new String[] { "2019-02-02", "2019-02-03", "2019-04-28", "2019-05-05", "2019-09-29",
"2019-10-12" };
for (String str : lawHolidayDateStr) {
lawHolidayDate.add(yyyyMMdd.parse(str));
}
for (String str : lawWorkDateStr) {
lawWorkDate.add(yyyyMMdd.parse(str));
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// Date startDate = sdf.parse(strStartDate);
// Date endDate = sdf.parse(strEndDate);
System.out.println("开始时间:" + sdf.format(startDate));
System.out.println("结束时间:" + sdf.format(endDate));
long workHours = workHours(startDate, endDate, lawHolidayDate, lawWorkDate);
System.out.println("相差分钟数:" + workHours);
return workHours;
}
}
~~