最近写的计算上班时间的程序,检查是否迟到早退,有没有打卡,防止被扣工资 博客分类: Java基础 java工作打卡
程序员文章站
2024-03-24 19:21:34
...
现在公司改革了,早退要扣一天的工资,如果上班或下班没有打卡要扣三天的工资,坑爹啊!还好人事会把指纹打卡记录的Excel发邮件给我们,如果发现有不对就马上去沟通,想办法解决,不然一天几百块伤不起啊!
这是公司的给我们发打卡记录(Excel):
找到自己的名字,把“对应时段”、“上班时间”、“下班时间”这三个列删除,然后把“日期”、“签到时间”、“签退时间”三个列的内容复制到“TimeTable.txt”中。
TimeTable.txt文件内容如下:
2012-9-3 08:46 19:29
2012-9-4 08:53 18:34
2012-9-5 08:29 18:27
2012-9-6 08:45 18:26
2012-9-7 09:05 18:40
2012-9-8 10:40 14:22
2012-9-9
2012-9-10 08:50 18:42
2012-9-11 08:45 18:10
2012-9-12 08:43 18:31
2012-9-13 08:40 18:49
2012-9-14 08:33 19:23
2012-9-15
2012-9-16
2012-9-17 08:46 18:31
2012-9-18 08:42 20:53
2012-9-19 08:48 18:57
2012-9-20 08:38 18:39
2012-9-21 08:35
2012-9-22
2012-9-23
2012-9-24 18:39
执行程序运行后的效果如图:
CMD窗口需调整一下宽和高:
Java的原代码如下:
我打包好的Jar、EXE、源代码(在Jar包里)都放在这里了,大家可以下载以后可以根据自己需求进行修改、希望对大家有些帮助!
这是公司的给我们发打卡记录(Excel):
找到自己的名字,把“对应时段”、“上班时间”、“下班时间”这三个列删除,然后把“日期”、“签到时间”、“签退时间”三个列的内容复制到“TimeTable.txt”中。
TimeTable.txt文件内容如下:
2012-9-3 08:46 19:29
2012-9-4 08:53 18:34
2012-9-5 08:29 18:27
2012-9-6 08:45 18:26
2012-9-7 09:05 18:40
2012-9-8 10:40 14:22
2012-9-9
2012-9-10 08:50 18:42
2012-9-11 08:45 18:10
2012-9-12 08:43 18:31
2012-9-13 08:40 18:49
2012-9-14 08:33 19:23
2012-9-15
2012-9-16
2012-9-17 08:46 18:31
2012-9-18 08:42 20:53
2012-9-19 08:48 18:57
2012-9-20 08:38 18:39
2012-9-21 08:35
2012-9-22
2012-9-23
2012-9-24 18:39
执行程序运行后的效果如图:
CMD窗口需调整一下宽和高:
Java的原代码如下:
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 计算上班时间,检查是否迟到早退,有没有打卡 * * @author vipbooks * @version 1.0.0 2012-9-19 */ @SuppressWarnings("unchecked") public class ComputeJobTime { // 文件名 private static String fileName = "TimeTable.txt"; // 文件路径 private static String filePath; // 读取出来的文件 private static File file; // 休息时间90分钟 private static long reposeTime = (60 + 30) * 60 * 1000; // 八小时工作制 private static int workTime = 8; private static SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd"); private static SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm"); private static final String EMPTY_STR = ""; private static final String FALSE_STR = "false"; private static final String TRUE_STR = "true"; private static final String TABLE_STR = "\t"; /** * 初始化TimeTable.txt文件 */ static{ filePath = ComputeJobTime.class.getResource(fileName).getPath(); try { // 防止中文乱码 filePath = URLDecoder.decode(filePath, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } file = new File(filePath); } /** * 计算工作时间 */ private static void computeTime() throws Exception { // 检查文件是否存在 if (file.exists()) { // 计算好的记录集 List<Map<Enum, String>> list = new ArrayList<Map<Enum,String>>(); // 计算好的一条记录 Map<Enum, String> map = null; // 读取文件 InputStream is = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); // 一行记录 String line = null; while ((line = br.readLine()) != null) { // 是否是周未 boolean isWeekend = false; // 日期 Date date = null; // 开始时间 Date startDate = null; // 结束时间 Date endDate = null; map = new HashMap<Enum, String>(); // 开始时间 map.put(Constant.START_TIME, EMPTY_STR); // 结束时间 map.put(Constant.END_CARD, EMPTY_STR); // 工作时间 map.put(Constant.JOB_TIME, EMPTY_STR); // 是否迟到 map.put(Constant.LATE, FALSE_STR); // 是否早退 map.put(Constant.EARLY, FALSE_STR); // 上班是否打卡 map.put(Constant.START_CARD, TRUE_STR); // 下班是否打卡 map.put(Constant.END_CARD, TRUE_STR); int index = line.indexOf(" "); if (index < 8) { continue; } // 获得日期 String dateStr = line.substring(0,index).trim(); map.put(Constant.DATE, dateStr); // 获得周 date = sdfDate.parse(dateStr); String week = getWeek(date); map.put(Constant.WEEK, week); if (week.equals(Week.SUNDAY.toString()) || week.equals(Week.SATURDAY.toString())) { isWeekend = true; } line = line.substring(index,line.length()); // 上班时间字符串 String t1 = line.substring(0,6).trim(); // 下班时间字符串 String t2 = ""; /** * 获得上班时间和下班时间的字符串,并判断上下班是否打卡 */ if (t1.length() < 2) { map.put(Constant.START_CARD, FALSE_STR); t2 = line.trim(); if (t2.length() < 2) { map.put(Constant.END_CARD, FALSE_STR); } } else { line = line.trim(); index = line.indexOf(" "); if (index < 1) { t1 = line.trim(); map.put(Constant.END_CARD, FALSE_STR); } else { t1 = line.substring(0,index).trim(); t2 = line.substring(index,line.length()).trim(); } } map.put(Constant.START_TIME, t1); map.put(Constant.END_TIME, t2); /** * 如果上班时间和下班时间都为空则跳过该循环 */ if (t1.length() < 2 && t2.length() < 2) { list.add(map); continue; } /** * 获得上班时间,并判断是否迟到 */ if (t1.length() > 2) { String[] strs = t1.split(":"); if (strs.length == 2) { int hour = Integer.valueOf(strs[0]); int min = Integer.valueOf(strs[1]); if (hour > 8 && min > 0) { if (!isWeekend) { map.put(Constant.LATE, TRUE_STR); } } startDate = sdfTime.parse(t1); } } /** * 获得下班时间 */ if (t2.length() > 2) { String[] strs = t2.split(":"); if (strs.length == 2) { endDate = sdfTime.parse(t2); } } /** * 获得总工作时间,并判断是否早退 */ if (endDate != null && startDate != null) { long[] diff = timeDifference(startDate, endDate); if (diff[0] < workTime) { if (!isWeekend) { map.put(Constant.EARLY, TRUE_STR); } } map.put(Constant.JOB_TIME, (diff[0]<10?"0"+diff[0]:diff[0]) + ":" + (diff[1]<10?"0"+diff[1]:diff[1])); } list.add(map); } br.close(); isr.close(); is.close(); System.out.println("日期\t\t周期\t上班时间\t下班时间\t工作时间\t是否迟到\t是否早退\t上班打卡\t下班打卡"); for (Map<Enum, String> result : list) { System.out.print(result.get(Constant.DATE) + TABLE_STR); System.out.print(result.get(Constant.WEEK) + TABLE_STR); System.out.print(result.get(Constant.START_TIME) + TABLE_STR); System.out.print(result.get(Constant.END_TIME) + TABLE_STR); System.out.print(result.get(Constant.JOB_TIME) + TABLE_STR); System.out.print(result.get(Constant.LATE) + TABLE_STR); System.out.print(result.get(Constant.EARLY) + TABLE_STR); System.out.print(result.get(Constant.START_CARD) + TABLE_STR); System.out.print(result.get(Constant.END_CARD) + TABLE_STR); if (result.get(Constant.WEEK).equals(Week.SUNDAY.toString())) { System.out.println(); } System.out.println(); } } else { System.out.println("TimeTable.txt文件不存在!"); } } /** * 求时间差 * * @param startDate * 开始时间 * @param endDate * 结束时间 * @return long[时,分] */ private static long[] timeDifference(Date startDate,Date endDate){ long diff = endDate.getTime() - startDate.getTime(); diff = diff - reposeTime; long hour = (diff / (60 * 60 * 1000)); long min = ((diff / (60 * 1000)) - hour * 60); return new long[] { hour, min }; } /** * 获得当前日期是星期几 * * @param date * @return */ private static String getWeek(Date date){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); String weekStr = null; int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; switch (week) { case 0: weekStr = Week.SUNDAY.toString(); break; case 1: weekStr = Week.MONDAY.toString(); break; case 2: weekStr = Week.TUESDAY.toString(); break; case 3: weekStr = Week.WEDNESDAY.toString(); break; case 4: weekStr = Week.THURSDAY.toString(); break; case 5: weekStr = Week.FRIDAY.toString(); break; case 6: weekStr = Week.SATURDAY.toString(); break; } return weekStr; } /** * 周枚举 */ private enum Week{ MONDAY(1,"星期一"),TUESDAY(2,"星期二"),WEDNESDAY(3,"星期三"), THURSDAY(4,"星期四"),FRIDAY(5,"星期五"),SATURDAY(6,"星期六"),SUNDAY(0,"星期日"); // 编码 private int code; // 名称 private String name; private Week(int code,String name){ this.code = code; this.name = name; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return name; } } /** * 常量枚举 */ private enum Constant { /** 日期 */ DATE, /** 周 */ WEEK, /** 开始时间 */ START_TIME, /** 结束时间 */ END_TIME, /** 工作时间 */ JOB_TIME, /** 是否迟到 */ LATE, /** 是否早退 */ EARLY, /** 上班是否打卡 */ START_CARD, /** 下班是否打卡 */ END_CARD } public static void main(String[] args) throws Exception{ long beginTime = System.currentTimeMillis(); computeTime(); long endTime = System.currentTimeMillis(); System.out.println("\n共耗时" + (endTime - beginTime) + "毫秒!"); } }
我打包好的Jar、EXE、源代码(在Jar包里)都放在这里了,大家可以下载以后可以根据自己需求进行修改、希望对大家有些帮助!