<Java自定义工具类>计算员工月度平均下班时间

news/2024/3/29 20:56:40/文章来源:https://blog.csdn.net/qq_42139049/article/details/129252389

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_75153.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I.MX6ULL内核开发12:使用设备树插件实现RGB灯驱动

目录 一、引言 二、设备树插件格式 三、实验说明 四、实验准备 4.1 通过内核工具编译设备树插件 五、实验效果 5.1 uboot加载 5.2 加载RGB驱动 一、引言 Linux4.4以后引入了动态设备树&#xff08;Dynamic DevicesTree&#xff09;&#xff0c;这里翻译位“设备树插件…

银行软件测试面试题目总结,希望可以帮到你

目录 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、根据题目要求写出具体LINUX操作命令 1、分别写出一种…

SpringMVC源码:HandlerMapping加载1

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…

跨设备文件传输工具横评

文章目录对比QQ微信SnapDropLocalSendIntelUnisonLANDropTailscaleAirDroidSendAnywhere参考文献对比 传输速度测试条件大致相同&#xff0c;文件大小约为 100 MB 工具优点缺点传输速度备注QQ支持断点续传不要求同一局域网需要安装1.81 MB/s微信方便需要安装不支持大文件传完还…

ROS1学习笔记:ROS中的坐标管理系统(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;ROS中的坐标系管理系统 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、机器人中的坐标变换二、TF功能包三、小海龟跟随实验3.1 启动实验3.2 查看当前的TF树3.3 坐标相对位置可视化3.3.1 tf_echo3.3.2 rviz一、机器人中的坐标变换…

15个Spring扩展点,一般人知道的不超过5个!

Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内部则是一片惊涛骇浪&#xff0c;汪洋一片。Spring Boot更是封装了Spring&#xff0c;遵循约定大于配置&#xff0c;加上自动装配的机制。很多时候我们只要引用了一个…

Maven高级操作,别说你不知道

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; &#x1f916; 一、聚合 &#x1f47b; 1、作用&#xff1a; 用于快速构建maven工程&#xff0c;一次性构建多个模块/项目 &am…

【人脸识别】DDL:数据分布知识蒸馏思想,提升困难样本(遮挡、低分辨率等)识别效果

论文题目&#xff1a;《Improving Face Recognition from Hard Samples via Distribution Distillation Loss》 论文地址&#xff1a;https://arxiv.org/pdf/2002.03662v3.pdf 代码地址&#xff1a;https://github.com/HuangYG123/DDL 1.前言及相关工作 Large facial variatio…

阿里前端二面常考react面试题(必备)

说说 React组件开发中关于作用域的常见问题。 在 EMAScript5语法规范中&#xff0c;关于作用域的常见问题如下。 &#xff08;1&#xff09;在map等方法的回调函数中&#xff0c;要绑定作用域this&#xff08;通过bind方法&#xff09;。 &#xff08;2&#xff09;父组件传递…

华为OD机试模拟题 用 C++ 实现 - 最左侧冗余覆盖子串(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明最左侧冗余覆盖子串题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写…

HCIP-5距离矢量路由协议RIP学习笔记

前言 路由信息协议RIP&#xff08;Routing Information Protocol&#xff09;的简称&#xff0c;它是一种基于距离矢量&#xff08;Distance-Vector&#xff09;算法的协议&#xff0c;使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。Rip是第一个动…

RK3568平台开发系列讲解(驱动基础篇)SMP(Symmetrical Multi-Processing)

🚀返回专栏总目录 文章目录 一、linux SMP 和 AMP二、linux SMP的启动流程三、CPU的描述:cpumask四、CPU之间的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 SMP(Symmetrical Multi-Processing)。 一、linux SMP 和 AMP 目前支持多核处理器的实时操…

QT学习14:QtXlsx操作Excel表

一、前言操作excel方式有&#xff1a;QAxObject 和QtXlsx区别&#xff1a;Qt自带的QAxObject库操作excel的前提是电脑已经安装微软的Office&#xff08;包含EXCEL&#xff09;&#xff0c;而QtXlsx可以直接使用免装Office且操作更简单。二、QtXlsx操作示例参考&#xff1a;http…

【Solved】java.lang.IllegalStateException: Could not delete shutdown key file

详细错误&#xff1a; Exception in thread “main” java.lang.IllegalStateException: Could not delete shutdown key file at edu.stanford.nlp.pipeline.StanfordCoreNLPServer.(StanfordCoreNLPServer.java:219) at edu.stanford.nlp.pipeline.StanfordCoreNLPServer.lau…

IDOR漏洞

IDOR漏洞 一、概述 IDOR&#xff0c;Insecure Direct Object reference&#xff0c;即"不安全的直接对象引用"&#xff0c;场景为基于用户提供的输入对象进行访问时&#xff0c;未进行权限验证&#xff0c;是一类访问控制漏洞。在OWASP API安全前10名的API漏洞中排名…

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(多指标评价)

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(多指标评价) 文章目录 回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(多指标评价)预测效果基本介绍程序设计参考资料预测效果 基本介绍 GRU神经网络是LST

Android SlidingPaneLayout实践

Android SlidingPaneLayout实践 可折叠设备在这里这一事实是无法回避的。在应用程序开发方面&#xff0c;它们带来了一些新的挑战。其中之一是可折叠设备的外形尺寸会根据折叠状态而变化。Android在设计上支持不同的外形尺寸&#xff0c;因此这很容易处理。但是&#xff0c;有…

软件测试面试题 —— 整理与解析(2)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;&#x1f30e;【Austin_zhai】&#x1f30f; &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xf…

零基础入门网络安全,看这一篇就够了!

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…

高精度真空度程序控制在真空解冻过程中的应用

摘要&#xff1a;为了解决目前各种真空冷冻过程中存在的真空压力还是人工手动调节&#xff0c;无法进行可编程准确自动控制的问题&#xff0c;本文提出了具体解决方案。解决方案的基本原理是根据动态平衡法&#xff0c;具体实现是依据不同的真空压力设定值分别采用电动针阀调节…