自定义函数计算两个日期之间的工作时间
现在客户的需求丰富多样,现有的函数可能不满足需求,所以就需要自定义函数来实现。
比如有这样的需求:计算两个时间点之间的工作时间,就是只计算周一到周五9点到12点之间的时间段和13点18点之间的时间段和,中间抛除中午休息的一小时,并且不包含周六日的时间。
分析:计算的是工作时间,周一到周五上午9点到12点和下午13点到18点时间段和。
根据时间点相差的工作日天数,可以分为两种情况处理:一.相差天数为0天,就是两个时间点在同一天,然后根据上班时间段来计算。二.相差工作日为N天的情况,时间段分为三部分,1开始时间当天的工作时间,2两个时间点相差N个工作日:N*8*60,3结束时间当天的工作时间。
计算流程图
程序实现伪代码:
// 计算出俩个日期相隔的天数
int daysBetween = getWorkingDay(date1, date2);
//Logger.debug(“相隔的天数:“+daysBetween);
if (daysBetween == 0) {
//开始时间和结束时间在同一天,计算两个时间点之间的工作时间(单位分钟)
if (date1== 7 || date2== 1) {
// 如果当天是周六或周日,相隔时间为0
discrepancyTime = 0; //相隔时间段,单位为分钟
else {
//开始时间和结束时间在同一天,并且都不是周末,时间段计算方法
//开始时间结束时间都在工作时间内,并且都在上午,或都在下午
if (((hourOne>=9 && hourOne <= 12) && (hourTwo <= 12 && hourTwo>=9))
|| ((hourOne >= 13 && hourOne <= 18) && (hourTwo >= 13 && hourTwo <= 18))) {
discrepancyTime = (int) ((date2.getTimeInMillis() – date1
.getTimeInMillis()) / 1000 / 60);
//Logger.info(“date1:” + date1.getTimeInMillis());
//Logger.info(“date2:” + date2.getTimeInMillis());
//Logger.info(“1-1 & 3-3 ” + discrepancyTime);
}
。。。。。。//其他情况,共15种情况
else {
//开始时间和结束时间不在同一天
daysBetween = daysBetween – 1;
int timeOne = 0; //开始时间当天的工作时间
int timeTwo = 0; //结束时间当天的工作时间
//
// 计算开始时间到当天下班时间的时差
if (date1== 7 || date2== 1) {
timeOne = 0;
else {
//开始时间在九点之前
if (hourOne < 9) {
timeOne = 8 * 60;
//Logger.info(“hourOne<9″);
。。。。。。//其他情况,共5种情况
}
// 计算结束时间当天的时间
if (day2 == 7 || day2 == 1) {
timeTwo = 0;
else {
//结束时间在九点之前
if (hourTwo < 9) {
timeTwo = 0;
//Logger.info(“hourTwo<9″);
}
。。。。。。//其他情况,共5中情况
}
//相隔时间
discrepancyTime = timeOne + timeTwo + daysBetween * 8 * 60;
//Logger.info(“相隔时间:“+discrepancyTime);
}
return discrepancyTime;
以上是实现函数体的伪代码。
用法:把实现函数的类放到<\designer\web\WEB-INF\classes目录下,然后在customFunctions.properties文件中登记此函数:getWorkingTime = 0,com.runqian.mis.util.GetWorkingTime
报表中的用法如图:
展现结果
文章中介绍了计算两个时间点之间工作时间的方法,附件中有完整的代码(带注释),有需要的同事请下载。