JAVA打卡记录计算时间

news/2024/11/9 1:44:08/

由于打卡机定义的计算规则与实际不符,为了更快计算,自己写了个工具,将导出的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


http://www.ppmy.cn/news/206357.html

相关文章

按键精灵手机助手计算时间差

这两天在用按键精灵手机助手写游戏脚本&#xff0c;需要计算时间差&#xff0c;先要获取两次时间&#xff0c;用系统自带的time()函数可以得到系统时间&#xff0c;不过得到的时间是秒数&#xff0c;需要转化一下 time()函数得到的是从1970年1月1日 8:00:00至今所经过的秒数 可…

F12下看html页面的响应时间,浏览器F12 Finish DOMContentLoaded load时间如何计算出来?...

白屏 // 不兼容performance.timing 的浏览器&#xff0c;如IE8 window.pageStartTime Date.now(); // 白屏时间结束点 window.firstPaint Date.now(); 因此白屏时间则可以这样计算出&#xff1a; 可使用 Performance API 时 白屏时间 firstPaint - performance.timing.navig…

人生时间计算器_真实年龄计算器app下载-抖音珍稀时间年龄计算器下载v1.5 安卓版-西西软件下载...

抖音珍稀时间年龄计算器app能够快速的计算出你真是的实际年龄,精确到每分每秒.同时向你预估出你人生中剩余的时间,在剩余的时间里还能做那些事情,让人们思考生从何来死往何去,记住你的每一个关键的纪念日,十分的有趣!点击下载抖音珍稀时间年龄计算器app就能看到自己的时间啦!…

接口请求到服务器端响应的时间,接口响应时间剖析

在日常工作过程中,我们经常需要关注接口的响应时间,优化接口的时延,那么接口的响应时间由哪些部分组成呢?先给出一个公式: 接口响应时间 = 请求机器与服务器之间包往返时间 RTT * N + 业务处理处理时间 通过下面的一组实验数据,我们可以完整地解析出从请求接口,到接口返…

Android 计算网络速度文件下载剩余时间<<最优方案>>

最近在项目开发中遇到了一项功能&#xff0c;需要在下载文件时显示出当前的网络速度和预计剩余时间&#xff0c;在调研中发现使用的比较多的是通过TrafficStats来获取网络使用量然后在间隔每秒后重新获取一次网络使用量&#xff0c;两者相机算既可以得出每秒的网络使用量。 pub…

Oracle 计算时间差

Oracle中计算时间差是经常用到的。可以使用“日期1-日期2”并加以运算,来获得你要想的时间差:天、小时、分钟或者秒。 例如: selectTO_DATE(2012-02-20 17:45:04,yyyy-mm-dd hh24:mi:ss)-TO_DATE(2012-02-19 08:34:04,yyyy-mm-dd hh24:mi:ss) as Dayfrom dual; 结果: 这里…

如何用计算机算时间,在win10电脑的计算器中如何进行日期的计算

在win10电脑的计算器中如何进行日期的计算 今天给大家介绍一下在win10电脑的计算器中如何进行日期的计算的具体操作步骤。 1. 首先打开电脑,找到自带的计算器,打开进入。 2. 在打开的计算器页面,点击页面上方的三横图标: 3. 在打开的菜单中,点击“日期计算”: 4. 打开的日…

实时下载速度的计算:

所谓的实时下载速度也是按秒计算的&#xff0c;直接每秒计算一下当前下载量与上次记录的下载量便可得到从 上一秒到这一秒的下载数据量&#xff0c;这样实时下载速度就得出来了&#xff0c;至于剩余时间&#xff0c;可以将当前下载的数 据量与耗用的秒为单位的时间进行计算&…