计算员工月度平均下班时间方式一:
输入:String[][] strArray = {{“09:00:00”, “18:00:08”},{“08:00:00”, “20:00:08”}};
输出:19:00:08
注意:该方法里面包含的特殊点如:
1,24点前下班和24点后下班的时间计算;
2,员工加班到第二天凌晨的时间怎么计算;
如:超过第二天5点,按5点计算下班时间(每个业务要求不一样)
代码可直接复制使用:
package cn.itcast;/** 计算员工月度平均下班时间* @param String[][]* @return String*/public class calculatAvgOfDutyTime {public static void main(String[] args) {//数组里面放的是上班时间和下班时间//上班时间唯一的作用是判断如果下班时间小于上班时间,则表示加班到第二天这个时间才下班String[][] strArray = {{"09:00:00", "18:00:08"},{"08:00:00", "20:00:08"},{"08:00:00", "05:00:00"},//加班到第二天凌晨5点{"08:00:00", "04:00:00"},//加班到第二天凌晨4点};System.out.println(calculation(strArray));}/*** 计算平均下班时间*/public static String calculation(String[][] strArray) {//总共秒数long total = 0;for (int i = 0; i < strArray.length; i++) {//判断是否是加班到第二天if (isTimeOut(strArray[i][0], strArray[i][1])) {//加班到第二天下班String time[] = strArray[i][1].split(":"); //时分秒分割long l1 = Long.parseLong(time[0]) * 3600; //小时转为秒数long l2 = Long.parseLong(time[1]) * 60; //分钟转为秒数long l3 = Long.parseLong(time[2]); //秒数//超过5点按5点计算下班时间(业务要求)total += (l1 + l2 + l3) > 5 * 3600 ? 5 * 3600 : (l1 + l2 + l3); //System.out.println("total,"+total);//第二天的时长加上第一天的工作时长total += (24 * 3600);}else {//24点之前下班String time[] = strArray[i][1].toString().split(":"); //时分秒分割long l1 = Long.parseLong(time[0]) * 3600; //小时转为秒数long l2 = Long.parseLong(time[1]) * 60; //分钟转为秒数long l3 = Long.parseLong(time[2]); //秒数total += (l1 + l2 + l3);}}//平均秒数long average = total / strArray.length; //计算平局每天的秒数//平均时间大于24点,显示第二天的时间,并且减去第一天的时长String nextDay = "";if (average >= 24 * 3600) {average = average - (24 * 3600);nextDay = "第二天";}long average1 = average / 3600; //秒数转小时long average2 = (average % 3600) / 60; //秒数转分钟long average3 = (average % 3600) % 60; //秒//不足两位前面补0String d1 = addZero(average1);String d2 = addZero(average2);String d3 = addZero(average3);String showTime = d1 + ":" + d2 + ":" + d3; //拼接时分秒showTime = showTime.equals("24:00:00") ? "00:00:00" : showTime;return showTime;}/*** 判断下班时间是否早于上班时间,如果是,说明是加班到第二天* 加班返回true,没加班返回false*/public static boolean isTimeOut(String sTime, String eTime) {String sTimeArr[] = sTime.split(":");String eTimeArr[] = eTime.split(":");//上班时间秒数long s1 = Long.parseLong(sTimeArr[0]) * 3600; //小时转为秒数long s2 = Long.parseLong(sTimeArr[1]) * 60; //分钟转为秒数long s3 = Long.parseLong(sTimeArr[2]); //秒数long sTotal = s1 + s2 + s3;//下班时间秒数long e1 = Long.parseLong(eTimeArr[0]) * 3600; //小时转为秒数long e2 = Long.parseLong(eTimeArr[1]) * 60; //分钟转为秒数long e3 = Long.parseLong(eTimeArr[2]); //秒数long eTotal = e1 + e2 + e3;return eTotal < sTotal;}/*** 日期时间补0*/public static String addZero(long i) {return i < 10 ? ("0" + i) : i + "";}
}
测试如下:
23:45:04
计算员工月度平均下班时间方式二:
输入:
String[] strArray_first = {“08:00:00”,“08:00:00”,“08:00:00”,“08:00:00”};
String[] strArray_second = {“18:00:08”,“20:00:08”,“05:00:00”,“04:00:00”};
输出:23:45:04
注意:特殊点除了第一种方式里面包含的方法之外还封装了以下方法:
1,统计下班时间大于平均下班时间2小时的次数;
代码可直接拷贝:
package cn.itcast;/** 计算员工月度平均下班时间,基准次数* @param String[] strArray_first , String[] strArray_second* @return String*/public class calculatAvgOfDutyTime2 {
public static void main(String[] args) {String[] strArray_first = {"08:00:00","08:00:00","08:00:00","08:00:00"};String[] strArray_second = {"18:00:08","20:00:08","05:00:00","04:00:00"};System.out.println("result:"+calculation(strArray_first,strArray_second));System.out.println("下班时间大于平均下班时间2小时的次数统计:"+calculatofDytyTimeNum(strArray_first,strArray_second,calculation(strArray_first,strArray_second)));}/*** 计算平均下班时间* @param String[] strArray_first , String[] strArray_second* @return String*/public static String calculation(String[] strArray_first,String[] strArray_second) {//总共秒数long total = 0;if(strArray_first.length == strArray_second.length) {for (int i = 0; i < strArray_first.length; i++) {//判断是否是加班到第二天if (isTimeOut(strArray_first[i], strArray_second[i])) {//加班到第二天下班String time[] = strArray_second[i].split(":"); //时分秒分割long l1 = Long.parseLong(time[0]) * 3600; //小时转为秒数long l2 = Long.parseLong(time[1]) * 60; //分钟转为秒数long l3 = Long.parseLong(time[2]); //秒数//超过5点按5点计算下班时间(业务要求)total += (l1 + l2 + l3) > 5 * 3600 ? 5 * 3600 : (l1 + l2 + l3); //System.out.println("total,"+total);//第二天的时长加上第一天的工作时长total += (24 * 3600);}else {//24点之前下班String[] time = strArray_second[i].toString().split(":"); //时分秒分割long l1 = Long.parseLong(time[0]) * 3600; //小时转为秒数long l2 = Long.parseLong(time[1]) * 60; //分钟转为秒数long l3 = Long.parseLong(time[2]); //秒数total += (l1 + l2 + l3);}}}//平均秒数long average = total / strArray_second.length; //计算平均每天的秒数//平均时间大于24点,显示第二天的时间,并且减去第一天的时长String nextDay = "";if (average >= 24 * 3600) {average = average - (24 * 3600);nextDay = "第二天";}long average1 = average / 3600; //秒数转小时long average2 = (average % 3600) / 60; //秒数转分钟long average3 = (average % 3600) % 60; //秒//不足两位前面补0String d1 = addZero(average1);String d2 = addZero(average2);String d3 = addZero(average3);String showTime = d1 + ":" + d2 + ":" + d3; //拼接时分秒showTime = showTime.equals("24:00:00") ? "00:00:00" : showTime;return showTime;}/*** 判断下班时间是否早于上班时间,如果是,说明是加班到第二天* 加班返回true,没加班返回false*/public static boolean isTimeOut(String sTime, String eTime) {String sTimeArr[] = sTime.split(":");String eTimeArr[] = eTime.split(":");//上班时间秒数long s1 = Long.parseLong(sTimeArr[0]) * 3600; //小时转为秒数long s2 = Long.parseLong(sTimeArr[1]) * 60; //分钟转为秒数long s3 = Long.parseLong(sTimeArr[2]); //秒数long sTotal = s1 + s2 + s3;//下班时间秒数long e1 = Long.parseLong(eTimeArr[0]) * 3600; //小时转为秒数long e2 = Long.parseLong(eTimeArr[1]) * 60; //分钟转为秒数long e3 = Long.parseLong(eTimeArr[2]); //秒数long eTotal = e1 + e2 + e3;return eTotal < sTotal;}/*** 日期时间补0*/public static String addZero(long i) {return i < 10 ? ("0" + i) : i + "";} /** 统计下班时间大于平均时间+2小时的次数;* @param String[] strArray_first , String[] strArray_second* @return String*/public static String calculatofDytyTimeNum(String[] strArray_first,String[] strArray_second,String avg) {int two_time_numb = 0;if(strArray_second.length > 0) {for (int i = 0; i < strArray_second.length; i++) {long total1 = 0; // 下班时间long total2 = 0; // 平均下班时间if (isTimeOut(strArray_first[i], strArray_second[i])) {//加班到第二天下班:下班时间转long;String time[] = strArray_second[i].split(":"); //时分秒分割long l1 = Long.parseLong(time[0]) * 3600; //小时转为秒数long l2 = Long.parseLong(time[1]) * 60; //分钟转为秒数long l3 = Long.parseLong(time[2]); //秒数//超过5点按5点计算下班时间(业务要求)total1 += (l1 + l2 + l3) > 5 * 3600 ? 5 * 3600 : (l1 + l2 + l3); //第二天的时长加上第一天的工作时长total1 += (24 * 3600);//平均下班时间+2转long;String time2[] = avg.split(":"); //时分秒分割long l4 = Long.parseLong(time2[0]) * 3600; //小时转为秒数long l5 = Long.parseLong(time2[1]) * 60; //分钟转为秒数long l6 = Long.parseLong(time2[2]); //秒数total2 = l4 + l5 + l6;//平均下班时间在24点之后if (total2 > 24 * 3600) {total2 += (l4 + l5 + l6) > 5 * 3600 ? 5 * 3600 : l4 + l5 + l6; total2 += (24 * 3600);total2 += (2 * 3600);}else {//平均下班时间在24点之前total2 = l4 + l5 + l6 + 2 * 3600;} }else {//下班时间String time[] = strArray_second[i].split(":"); //时分秒分割long l1 = Long.parseLong(time[0]) * 3600; //小时转为秒数long l2 = Long.parseLong(time[1]) * 60; //分钟转为秒数long l3 = Long.parseLong(time[2]); //秒数total1 += l1 + l2 + l3;//平均下班时间+2转long;String time2[] = avg.split(":"); //时分秒分割long l4 = Long.parseLong(time2[0]) * 3600; //小时转为秒数long l5 = Long.parseLong(time2[1]) * 60; //分钟转为秒数long l6 = Long.parseLong(time2[2]); //秒数total2 = l4 + l5 + l6 + 2 * 3600;}if(total1 >= total2) {two_time_numb += 1;} }}return Integer.toString(two_time_numb);}
}
测试如下:
result:23:45:04
下班时间大于平均下班时间2小时的次数统计:2
如果您觉得有用,就动动发财的小手点个赞哈,感谢啦!!!