计算平均时间

序号工作日期上班时间下班时间
12019-03-0108:55:0018:01:24
22019-03-0408:55:0021:00:08
32019-03-0508:55:0021:00:18
42019-03-0608:55:0021:00:00
52019-03-0708:55:0021:00:00
62019-03-0808:55:0018:00:00
72019-03-0908:55:0003: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 + "";
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值