序号 | 工作日期 | 上班时间 | 下班时间 |
1 | 2019-03-01 | 08:55:00 | 18:01:24 |
2 | 2019-03-04 | 08:55:00 | 21:00:08 |
3 | 2019-03-05 | 08:55:00 | 21:00:18 |
4 | 2019-03-06 | 08:55:00 | 21:00:00 |
5 | 2019-03-07 | 08:55:00 | 21:00:00 |
6 | 2019-03-08 | 08:55:00 | 18:00:00 |
7 | 2019-03-09 | 08:55:00 | 03:10:20 |
假如现在有以上表格,记录了每天的上下班时间,现在要求出平均每天的下班时间。
public class Test {
public static void main(String[] args) {
//数组里面放的是上班时间和下班时间
//上班时间唯一的作用是判断如果下班时间小于上班时间,则表示加班到第二天这个时间才下班
String[][] strArray = {{"08:55:00", "18:01:24"},
{"08:55:00", "21:00:08"},
{"08:55:00", "21:00:18"},
{"08:55:00", "21:00:00"},
{"08:55:00", "21:00:00"},
{"08:55:00", "18:00:00"},
{"08:55:00", "03:10:20"}//加班到第二天凌晨3点
};
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]); //秒数
total += (l1 + l2 + l3) > 6 * 3600 ? 6 * 3600 : (l1 + l2 + l3); 超过6点按6点计算
//第二天的时长加上第一天的工作时长
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; //秒
//不足两位前面补0
String 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 + "";
}
}