`
vipbooks
  • 浏览: 149332 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

最近写的计算上班时间的程序,检查是否迟到早退,有没有打卡,防止被扣工资

阅读更多
   现在公司改革了,早退要扣一天的工资,如果上班或下班没有打卡要扣三天的工资,坑爹啊!还好人事会把指纹打卡记录的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的原代码如下:
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包里)都放在这里了,大家可以下载以后可以根据自己需求进行修改、希望对大家有些帮助!
  • 大小: 122.6 KB
  • 大小: 102.3 KB
  • 大小: 19.6 KB
0
3
分享到:
评论
8 楼 zhangmengLOVE_007 2012-11-19  
要是添加倒班能不能啊?
7 楼 zhaoyou 2012-10-15  
换公司吧, 不过你闲的有时间写个程序, 估计你也不会迟到了.
6 楼 vipbooks 2012-10-10  
哈哈,是民企啊,香香港上市,国企应该可以不打卡吧! 

用VBA是也可以,而且也很方便!
我是想复习一下枚举,还有把jar打包成EXE!
而且用EXE很方便的,送给MM用最好啦,简单实用,一点就会!
5 楼 datawarehouse 2012-10-10  
有点夸张了吧
4 楼 flysheet 2012-10-10  
这是国企吗,太坑爹了,还是不打卡爽?
3 楼 daaoke 2012-10-10  
vba也不错。。难道LZ只会JAVA...悲哉。
2 楼 tonly85 2012-10-10  
何苦呢,Excel的Formula完全可以实现的
1 楼 cesia1984 2012-10-10  
excel里直接判断也行嘛

相关推荐

    公司迟到早退管理制度.pdf

    公司迟到早退管理制度是企业管理的重要组成部分,主要目的是规范员工行为,提高工作效率,创造良好的工作环境。这份制度适用于公司的全体工作人员。 首先,制度中定义了迟到和早退的标准。迟到是指在规定的上班时间...

    最全面的考勤管理制度汇编.doc

    本制度详细规定了员工的上下班时间、打卡规则、加班政策、漏卡补卡流程、迟到早退及旷工的处理、全勤奖的设定以及假期请休假的管理。 一、上班时间和打卡规定 1. 上班时间通常为周一至周五的08:00-12:00和13:30-17...

    健身会所考勤制度.doc

    6. 旷工处理:无故迟到、早退30分钟以上或未上班被视为旷工。旷工半天扣一天工资,一天旷工扣三天工资。连续旷工三天或以上视为自动离职,扣除所有未发工资。 7. 加班规定:接到加班通知或工作命令的员工应配合加班...

    幼儿园教职工考勤管理制度.docx

    迟到、早退有不同的扣款标准,迟到1-10分钟扣月基本工资10%,以此类推。频繁迟到、早退会影响评优和调薪资格。迟到、早退超过一定时间将按旷工处理。 7. 病假: 一天以上病假需提供镇级以上医院的证明并经园领导...

    员工的考勤制度.docx

    迟到5分钟以上会被视为迟到,不同时间段的迟到会有不同的扣薪标准,严重者按旷工处理。同样,未经批准的早退也会有相应的扣薪措施。旷工不仅会扣薪,连续或累计旷工达到一定天数,可能会面临解雇。员工外出办理业务...

    2021最新员工上班规章制度范本参考.doc

    - 考勤制度:员工需要按时打卡,迟到、早退和旷工都有明确的扣薪规定,频繁的迟到早退会被视为旷工处理。 - 请假制度:包括病假和事假,需提前申请,病假需提供医疗证明,事假期间无工资。请假审批权限根据请假...

    公司常用表格模板系列-xxx科技发展有限公司考勤制度.doc

    这份文档详细列出了考勤管理的各项规则,包括打卡制度、迟到早退的处理、旷工定义以及请休假管理等。 首先,考勤工作由主管负责,包括制度解释、执行情况检查、分析和管理工作。考勤内容涵盖出勤、迟到、早退、旷工...

    企业办公小程序源码分享

    同时,可能还涉及到时间管理算法,用于计算迟到、早退等情况,并自动生成考勤报表供管理层参考。 二、薪资计算模块 薪资计算模块处理员工的工资发放,包括基本工资、奖金、扣款、福利等各项收入和支出。源码可能...

    考勤管理制度汇总12.doc

    这套规则旨在明确员工的上下班时间、打卡规定、迟到早退的处理方式以及请假制度等,以保障公司的运营效率和员工的权益。 1. **上下班时间与打卡制度**:员工的正常工作时间通常设定为上午8:30至10:00,下午1:30至5:...

    某个房地产考勤制度.docx

    2. 迟到而不打卡被视为旷工处理。例如,员工迟到后未打卡,但在下班时打卡,会被视为旷工。 3. 考勤人员包庇他人未打卡或篡改考勤信息会受到罚款。 4. 因公外出或公务原因未打卡的员工需在规定时间内补办手续,并由...

    公司员工考勤制度.doc

    迟到早退的罚款和计算方式也有明确标准。严禁代打卡,否则将受到严重处分。加班、病假、事假等特殊情况的处理也有详细规定。 总之,这份考勤制度明确了员工的职责、出勤规定、请假流程、迟到早退的惩罚以及考勤记录...

    LD物业顾问公司考勤制度.docx

    通过严格的考勤管理,可以有效地监控员工出勤情况,防止滥用假期和迟到早退现象,同时也能激励员工按时出勤,提高工作积极性。此外,它还提供了一个公平的考核标准,对违反规定的员工进行相应的奖惩,有利于维护公司...

    01415 人力资源管理培训教材-工作时间及给假制度(PPT 18页).ppt

    此外,公司对各种假期的扣款也有明确规定,例如事假、病假、迟到早退、欠班和旷工等,都有相应的薪资扣除标准。 在给假制度上,未经请假或未办理请假手续的缺勤被视为旷工,连续旷工3天或月累计6天将被开除,试用期...

    公司办公室考勤管理制度(钉钉版).pdf

    迟到是指在规定上班时间后到岗,早退则是提前下班,未经批准的离岗则被视为擅离职守。旷工包括未请假、请假未获批准或未按时报到等情况。 权限管理方面,人力资源部负责钉钉系统的维护、权限管理以及考勤的日常管理...

    公司办公室考勤管理制度汇编(钉钉版).doc

    例如,迟到10分钟以上可能被视为旷工,早退也会受到相应扣款。考虑到交通状况,每月有2次10分钟内的迟到豁免,超出部分则罚款。 忘打卡的情况需在规定时间内申请补卡,每月不超过3次,否则会有罚款。补卡需经过上级...

    公司员工上下班遵守细则(制度范本、DOC格式).doc

    首先,员工上下班需严格按照作息时间进行,迟到和早退都有明确的规定。迟到3分钟至15分钟视为迟到,超过15分钟则被视为旷工;早退则一律视为旷工半天。对于迟到,公司采取逐次加重的惩罚措施,以当月为周期,首次...

    小公司员工考勤管理制度.pdf

    - 无故旷工半天者将受到警告,每月累计3天旷工扣当月工资并记过,连续一周旷工者将被解雇。 4. **病假**: - 一天内的病假最迟在次日申请,连续病假一天以上需提供公立医院的就医证明。 - 全年病假累计不超过30...

    员工考勤和管理制度.doc

    迟到、早退累积达到一定次数会扣减工资,旷工则按照上班时间的两倍计算扣款。同时,连续旷工或累计旷工达到一定程度,将影响员工的奖金和职务晋升。 3. 脱岗行为也将受到不同程度的工资扣除,严重者可能按旷工处理。...

Global site tag (gtag.js) - Google Analytics