首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2013-09-11 
最近写的计算上班时间的程序,检查是否迟到早退,有没有打卡,防止被扣工资现在公司改革了,早退要扣一天的工

最近写的计算上班时间的程序,检查是否迟到早退,有没有打卡,防止被扣工资
   现在公司改革了,早退要扣一天的工资,如果上班或下班没有打卡要扣三天的工资,坑爹啊!还好人事会把指纹打卡记录的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包里)都放在这里了,大家可以下载以后可以根据自己需求进行修改、希望对大家有些帮助!


用VBA是也可以,而且也很方便!
我是想复习一下枚举,还有把jar打包成EXE!
而且用EXE很方便的,送给MM用最好啦,简单实用,一点就会! 7 楼 zhaoyou 2012-10-15   换公司吧, 不过你闲的有时间写个程序, 估计你也不会迟到了.
我的异常网推荐解决方案:软件开发者薪资,http://www.myexception.cn/other/1391128.html

热点排行