本文分享一个drools校验日期区间内时间段的校验方法。
案例如下:电商品台新增一个促销活动,2019年10月份,限时每天10点至13点,下单9折活动。
首先可以用 date-effective 和 date-expires 两个属性限制日期区间为2019-10-01 至 2019-10-31,但是每天10点至11点该怎样限制呢?下面给出我的想法,算是抛砖引玉。
1、方法一:利用function
drl文件如下所示:
package rules;//包名
//引入类库
import java.text.SimpleDateFormat
import java.util.*
//处理时间的function
function boolean checkDate(String st ,String et){
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date startTime = sdf.parse(st);
Date endTime = sdf.parse(et);
Date nowCal = sdf.parse(sdf.format(calendar.getTime()));
if(nowCal.after(startTime) && nowCal.before(endTime)){
return true;
}else{
return false;
}
}
//规则
rule "function_rule"
//属性限制起止日期
date-effective '2019-10-01'
date-expires '2019-10-31'
when
//对时间点进行校验
eval(checkDate('10:00:00','13:00:00'))
then
System.out.println("success function_rule");
end
2、方法二:利用Calendar判断
package rules;
import java.text.SimpleDateFormat
import java.util.*
rule "method_2"
date-effective "2019-10-01"
date-expires "2019-10-31"
when
$c:Calendar((get(Calendar.HOUR_OF_DAY) >=10 && <17),(get(Calendar.MINUTE) >=0 && <=59),(get(Calendar.SECOND) >=0 && <=59))
//(get(Calendar.HOUR_OF_DAY) >=10 && <17) 等价于 (get(Calendar.HOUR_OF_DAY) >=10,(get(Calendar.HOUR_OF_DAY)<17
then
System.out.println("success method_2");
end
这种方式需要在kieSession中insert一个Calendar实例。相对于方法一写法清秀了很多,一些细节上的内容也更清楚一些。
以上就是个人的一些拙见,如果您有更好的还希望您能不吝赐教。