首先简单描述一下业务上的需求:要计算出差的补助。
计算规则如下:
1.有三组变量,分别为出差时间、规定劳动时间、出差地当地劳动时间(各自包含开始和结束时间)
2.原来的需求描述为:
出差时间在规定劳动时间内的话不计算补助。
出差开始时间早于规定劳动时间的话,差的时间作为补助时间来计算。但是差的时间内包含出差地当地的劳动时间的话要将其前后的时间作为补助时间计算。
出差结束时间晚于规定劳动时间的话,差的时间作为补助时间来计算。但是差的时间内包含出差地当地的劳动时间的话要将其前后的时间作为补助时间计算。
3.在规定劳动时间之前的出差时间称为前补助时间,规定劳动时间之后的出差时间称为后补助时间。
4.补助计算以小时计,只舍不入。
5.工作日的补助计算是前后时间单算,补助金额相加;非工作日的补助计算是前补助时间加上后补助时间,一块算金额。
6.存在跨天选项,即有可能是从21点工作到第二天凌晨3点。
7.职务人员只考虑规定劳动时间。
乍一看这需求,字挺多,但是倒也不难理解。就是算出来出差时间既不在规定劳动时间也不在当地劳动时间的时间就ok了呗。
首先祭出if else大法。似乎有一些麻烦,算了,先想单一的,工作日的计算。
首先,获取各个时间。startTime,endTime,ruleStartTime,ruleEndTime,localStartTime,ruleEndTime
第一种情况,最简单的,规定劳动时间和当地劳动时间正好重合了;
if ruleStartTime==localStartTime&&ruleEndTime==ruleEndTime:
beforeTime=ruleStartTime-startTime>0?ruleStartTime-startTime:startTime-ruleStartTime
继续,稍微复杂一点,规定劳动时间开始时间晚于当地劳动时间开始时间;
再来,规定劳动时间开始时间早于当地劳动时间开始时间,也不难;
等等,还有一种情况,规定劳动时间的结束时间也早于当地劳动时间的结束时间,
还有,当地劳动时间开始时间介于规定劳动时间开始时间和结束时间中间;
厉害了word哥,这还没算上工作日和休息日、跨天、职务的区分,光一个前补助时间就这么多条件了,并且最可怕的是,可能还没想全。
看来这个if else大法不太灵光,又傻,代码量还高,并且逻辑上不安全。
那就得想一下了,回到之前那句话:算出来出差时间既不在规定劳动时间也不在当地劳动时间的时间。
简单一想,这不就是求出来出差时间这个集合与(规定劳动时间与当地劳动时间的合集)的差集吗?
第一个念头是区间,有现成的可以表示区间的数据结构吗,仔细想了想想不着。凑合用Array[2]吧。也能达到目的。
这个方法好!是真好,我接下来只需要实现两个方法;
function 求合集(arr1,arr2)
function 求差集(arr1,arr2)
开始面向过程。。。
还是不行,why?还得考虑 规定劳动时间与当地劳动时间的合集 不连续的情况,不连续的话求差集要分开算。而分开算的差集也有可能不是连续的。最长可能为三段
那么还是得调用2的3次方次 function 求差集。太麻烦了,不想弄。还是得多动脑子少编码。
可是光想这几个方法的实现已经耗费了大半个晚上的时间,老婆喊着要睡觉了。
躺床上就在想,数学上的集合不好使,用编程上的集合,全列出来。
第二天起来,思路一写,哈哈,问题解决了。
时间全部换算成分钟制,区间写入array,求合集,直接用set。求差集,直接for not in,set;
求出差集之后,判断一下是否连续,也很简单,首尾之差是否等于数组的长度。不连续就拆分一下。
拆分完了,每一段分别比较一下和规定劳动时间的大小,确定是前补助时间还是后补助时间。完事,除以60,得到小时数。美滋滋。
并且我这个只给你算出来时间,至于你要怎么用时间,怎么算补助,是什么职位,后边简单一算就行了。so easy。
编程真有趣,哈哈。
现在看来这个抽象思想,建模思想真是好。不然我们小时候做应用题为什么要列方程而不是穷举呢?
并且也给我解决问题提供了一种思路,多总结规律,抽象出数学模型,问题就会简单的多。
最重要的,多思考,用脑子编程。