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

现在公司改革了,早退要扣一天的工资,如果上班或下班没有打卡要扣三天的工资,坑爹啊!还好人事会把指纹打卡记录的Excel发邮件给我们,如果发现有不对就马上去沟通,想办法解决,不然一天几百块伤不起啊!

这是公司的给我们发打卡记录(Excel):
[img]http://dl.iteye.com/upload/attachment/0074/7911/1c19d497-cb03-3e3e-b68e-49751dd01191.jpg[/img]

找到自己的名字,把“对应时段”、“上班时间”、“下班时间”这三个列删除,然后把“日期”、“签到时间”、“签退时间”三个列的内容复制到“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

执行程序运行后的效果如图:
[img]http://dl.iteye.com/upload/attachment/0074/7927/be5dac01-773e-37ba-961c-dc8cf4c5a245.jpg[/img]

CMD窗口需调整一下宽和高:
[img]http://dl.iteye.com/upload/attachment/0074/7935/7e6e1352-d380-3589-8c37-5805314a9af2.jpg[/img]

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包里)都放在这里了,大家可以下载以后可以根据自己需求进行修改、希望对大家有些帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值