自定义函数计算两个日期之间的工作时间

润乾报表提供了丰富的内置函数,可以实现复杂的运算。

现在客户的需求丰富多样,现有的函数可能不满足需求,所以就需要自定义函数来实现。

比如有这样的需求:计算两个时间点之间的工作时间,就是只计算周一到周五9点到12点之间的时间段和1318点之间的时间段和,中间抛除中午休息的一小时,并且不包含周六日的时间。

分析:计算的是工作时间,周一到周五上午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

报表中的用法如图:

展现结果


文章中介绍了计算两个时间点之间工作时间的方法,附件中有完整的代码(带注释),有需要的同事请下载。