由于打卡机定义的计算规则与实际不符,为了更快计算,自己写了个工具,将导出的excel打卡记录重新进行计算。

代码如下:


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;public class TestExcel {public static void main(String[] args) {File file = new File("E:\\检验打卡表\\6_标准报表.xlsx");try {Workbook wb = WorkbookFactory.create(file);//载入excelSheet sheet = wb.getSheet("考勤记录");//获取考勤记录工作表int rowCount = sheet.getPhysicalNumberOfRows();//行数int cellCount = 0;String uName = "";for(int i=2; i<rowCount;i++) {System.out.println("-----------------------------------------------------");Row row = sheet.getRow(i);if(i==2) {//当前行存储打卡日期String time = row.getCell(i).getStringCellValue();System.out.println("| 时间: "+time+"                           ");cellCount = Integer.parseInt(time.substring(time.length()-2, time.length()));//从本月结束日期截取本月天数}if(i<=3) continue;if(i>3 && i%2==0) {//姓名uName = row.getCell(10).getStringCellValue();System.out.println("\n"+uName);}else {double totalTimeForMonth=0;List<String> errorDay = new ArrayList<String>();//异常日for(int j=0;j<cellCount;j++) {Cell cell = row.getCell(j);if(cell.getCellTypeEnum() == CellType.STRING) {System.out.println("++++++++++++++++++++++++++++");String value = cell.getStringCellValue();System.out.println(j+1+"号: "+value);List<String> time = TestExcel.timeStrToList(value);if(time.size()%2!=0) {System.out.println("时间异常,请检查!"+time.toString());errorDay.add((j+1)+"号");continue;}System.out.println("---------------------------------------------");double totalTime = 0;for(int t=0;t<time.size();t+=2) {System.out.print("上班时间: "+time.get(t));System.out.print("下班时间: "+time.get(t+1));double tempTime = TestExcel.calcTime(time.get(t), time.get(t+1));System.out.println("时长: "+tempTime);totalTime = totalTime + tempTime;}System.out.println("【"+uName+"】:"+(j+1)+"号共上班 【"+totalTime+"】小时");totalTimeForMonth = totalTimeForMonth + totalTime;}}System.out.println("【"+uName+"】:本月共上班 【"+totalTimeForMonth+"】小时");if(errorDay.size()>0) {System.out.println("打卡异常共计"+errorDay.size()+"天未累加,分别为:"+errorDay.toString());}}}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (EncryptedDocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvalidFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 将时间串转换为数组列表* @param s* @return*/public static List<String> timeStrToList(String s) {int l = s.length();List<String> time = new ArrayList<String>();for(int i=0;i<l/5;i++) {//System.out.println(s.substring(i*5, (i+1)*5));time.add(i, s.substring(i*5, (i+1)*5)) ;}TestExcel.removeDuplicate(time);//去重return time;}/*** 递归去除重复打卡时间* @param timeArr*/public static void removeDuplicate(List<String> timeArr) {String before = null;boolean flag = false;for(int i=0;i<timeArr.size();i++) {if(null==before) {before = timeArr.get(i);continue;}SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");try {Date beginTime = sdf.parse(before);Date endTime = sdf.parse(timeArr.get(i));if( (endTime.getTime() - beginTime.getTime())/(1000*60)<10) {//10分钟之内为重复打卡timeArr.remove(i-1);//重复保留当前时间,移除上次打卡时间flag = true;break;}} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}before=timeArr.get(i);//当前时间作为下一次的开始时间}if(flag) {//找到重复打卡>继续去重TestExcel.removeDuplicate(timeArr);}}/*** 计算每个班的时间(超出半小时按半小时算,不足半小时直接忽略)* @param begin 上班时间* @param end 下班时间* @return*/public static double calcTime(String begin, String end) {SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");try {Date beginTime = sdf.parse(begin);Date endTime = sdf.parse(end);double tt = (endTime.getTime() - beginTime.getTime())/(1000*60);if(tt/60-(long)(tt/60)>=0.5) {return (long)(tt/60)+0.5;}else {return (long)(tt/60);}} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}return 0;}}

需要导入poi, maven导入如下

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version>
</dependency>

excel下载链接:https://pan.baidu.com/s/14rCzcsiFiexq7Agg45YIJw 提取码:f8vw

JAVA打卡记录计算时间相关推荐

  1. java当前时间查询,Java实现查询记录的时间相对于当前时间

    import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Date; public cla ...

  2. java借书记录归还时间问题_关于B-E00007-图书借阅管理系统bug修复总结

    引言:昨日我重新审视了B-E00007-基于Java web的图书借阅管理系统的bug问题,主要是借阅图书和归还图书的bug问题,这两个借阅日期和归还日期不太准确,以及借阅后图书数量未发生变化,所以对 ...

  3. 华为OD机试真题 Java 实现【异常的打卡记录】【2023Q1 100分】

    一.题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据. 为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的收集打卡记录进行异常排查. 如果出现以下两 ...

  4. 华为OD机试真题 C++ 实现【异常的打卡记录】【2022.11 Q4 新题】

         所有题目均有四种语言实现.C++ 实现目录.Python实现目录.Java实现目录.JavaScript实现目录 题目 题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算 ...

  5. 华为OD机试真题 Python 实现【异常的打卡记录】【2022.11 Q4 新题】

        所有题目均有四种语言实现.C++ 实现目录.Python实现目录.Java实现目录.JavaScript实现目录 题目 题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职 ...

  6. 我用java分析了原神抽卡记录

    起因 我们都知道原神抽卡是有保底机制的,但是游戏里面只能按页查看抽卡记录,并没有各种数据统计,为了能够优化大家的游戏体验,本文就带大家用java爬虫来获取抽卡信息. 抽卡信息api解析 由于我用的是安 ...

  7. 使用Java的Calendar类计算两段时间之间的工作日的天/小时/分钟/秒数

    计算两段时间之间的工作日的天/小时/分钟/秒数 我们能经常遇到一些需求,让获取工作日的时间(当然,调休也上班也是工作日哈!),之前自己给这搞得头大,所以整理总结,把该工具类记录下来,希望大家能用到的时 ...

  8. java计算时间差距_硬计算和软计算之间的差异

    java计算时间差距 什么是计算? (What is Computing?) The process of accomplishing a particular task with the help ...

  9. java计算时间的秒数差,去掉周末和节假日

    java计算时间的秒数差,去掉周末和节假日 如题所说,计算两个时间的秒数(工作日),拿到这个需求,首先想到的就是怎么去掉周末和节假日,或者两个时间有一个在周末或节假日,或者两个时间都在,要分别进行处理 ...

  10. 打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间

    目前有1张打卡记录表,1张排班表,效果要打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间的!效果图 目前问题点:1.视图写法把区间时间写死,没法根据排班信息进行打卡数据分类 ...

最新文章

  1. java中读取properties文件内容五种方式
  2. 认识MySQL Replication
  3. Bootstrap4+MySQL前后端综合实训-Day04-PM【PowerDesigner 图形化数据库设计软件(设置依赖关系、自动增长主键、生成sql语句)、SQLyog软件(备份数据库)】
  4. php 下拉菜单多选get,Jquery实现select二级联动多选下拉菜单
  5. linux网络通信移植,基于socket API的C/S通信:将Qt程序从Linux移植到windows
  6. KafkaAPI实战
  7. cdoj 1092 韩爷的梦
  8. 寒假CF1 C-龟龟
  9. 【利用python3和微信接口给女朋友做个公众号推送】
  10. PowerBuilder方式下图像存储功能的研究
  11. arm模拟器手机版_基于ARM的模拟器
  12. 微信、qq可以上网,但是浏览器却不能上网怎么办
  13. docker入门及安装及基本命令
  14. 几种简单的文本数据预处理方法
  15. 电源电力专业术语整理
  16. C#实现五子棋详细教程
  17. Swift语言Storyboard教程:第一部分
  18. Y9000X安装Ubuntu 系统没有无线网卡驱动问题解决方法
  19. 2021西门子比赛东北赛区一等奖WINCC画面
  20. 外汇天眼:投资200美元起 每天收益7%!千万别被蒙蔽双眼!

热门文章

  1. linux forge服务器,linux下搭建我的世界spongeforge 服务器 (海绵端)
  2. java输入年月输出日历_Java实现按年月打印日历功能【基于Calendar】
  3. Python数据处理Tips数据特征处理离散化和二值化
  4. 一步步破解app协议第二步(审计代码)
  5. SSM项目转Springboot项目
  6. 【C++设计模式】抽象工厂模式
  7. 百度地图只显示行政区划轮廓
  8. 部署mongDB数据库服务
  9. 微信小程序 ui框架(辅助)
  10. Axure 9母版引发事件