计算员工月度平均下班时间方式一:
输入: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

如果您觉得有用,就动动发财的小手点个赞哈,感谢啦!!!

<Java自定义工具类>计算员工月度平均下班时间方式一相关推荐

  1. 【开发随机】JAVA+POI+自定义注解+反射构建自定义工具类实现快捷简便的Excel模板化导出(附demo代码)

    220907更新 项目UAT期间,用户反映了一个问题,数据量稍大的情况下,会出现"从某一行开始,往下所有行设置的字体和字体大小不生效"的BUG. 经过排查,发现原因是:POI的XS ...

  2. 第三次学JAVA再学不好就吃翔(part27)--自定义工具类

    学习笔记,仅供参考 面向对象 自定义工具类中使用静态方法 有的时候,我们需要创建一个自己的工具类,方便工作和学习中使用. 在工具类中,我们要在里面放一些静态的方法,方便我们用类名调用,这时,为了防止有 ...

  3. Hutool Java常用工具类汇总

    简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...

  4. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

  5. java常用工具类和Hutool常用的工具类整理

    java常用工具类和Hutool常用的工具类整理 1.java常用工具类 1.1 Scanner类 /*** Scanner 类*/@Testpublic void testScanner() {Sc ...

  6. python如何设计工具类_Python基础之自定义工具类

    class ListHelper: @staticmethod def find_all(target, func_condition): """ 查找列表中满足条件的所 ...

  7. 自定义工具类:工具类介绍

    自定义工具类 自定义注解 自定义注解 package com.learn.domain.poi;import java.lang.annotation.ElementType; import java ...

  8. java日期工具类DateUtil

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. DateUtil类 [java] view plain copy package com.util; ...

  9. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

最新文章

  1. 【青少年编程竞赛交流】11月份微信图文索引
  2. 行人姿态估计--Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
  3. 公司--As Imp的写法
  4. 在FireFox浏览器上,用stopImmediatePropagation阻止冒泡鼠标滚动事件
  5. 音乐应用开发Android应用开发--MP3音乐播放器界面设计(2)
  6. Python学习教程实用技法:通过公共键对字典列表排序—itemgetter
  7. go语言有哪些劣势?
  8. zk reconnect
  9. Exercise 12: Prompting People
  10. c++标准库中,含有链表的类list
  11. Linux——grep文本搜索命令
  12. Ubuntu16.04下codeblocks16.01安装,适用于不同的架构
  13. 无人机官方网站_无人机开发设计资料整理
  14. Java-java.util.concurrent.LinkedBlockingQueue
  15. (10)Redis------必须知道的基础内容
  16. 喜马拉雅音频批量下载源码
  17. Apache虚拟主机的三种方式
  18. 图片中添加箭头【使用PPT实现】
  19. java一天一只顽猴想去从山脚_六年级上册语文一课一练(附答案)
  20. 关于主从复制的超详细解析(全)

热门文章

  1. 如何从EPROCESS辨别一个进程是否已退出
  2. 再见邓肯!再见石佛!
  3. SQLserver服务器修复,SqlServer数据库损坏后的修复过程
  4. linux下的符号链接文件
  5. 工欲善其事,必先利其器:5大Java自动化部署工具
  6. 五大顶会2019必读的Graph Embedding最新论文
  7. 泰勒图的MATLAB实现
  8. uniapp自定义密码输入键盘-数字键盘效果demoUI方法一(整理)
  9. SpringBoot读取资源文件
  10. python爬取颤音_终于知道尾音发声的处理技巧