钉钉是一个移动办公app,员工可以在上面请假,加班等,当我们在请假的时候,选择一个开始和结束时间,然后它会自动的计算这个时间段的上班时间(排除周末),例如周内上班时间为[9:00-12:00],[13:30-18:30],那么你周二从8:00请假到13:00,那么系统会计算为3个小时。

它这个和一般的计算两个点的时间差不同,因为要过滤掉特定的时间段和特定的日期(周六日)。那么这个怎么实现呢?

思路分析

其实要实现这个,主要解决两个问题就好,第一,如何识别周内,周末,第二,如何计算两个时间段的交集。

首先我们要建立一个计算的基础,就是两个时间点之间的时间差,然后有两点我们是可以确定的:1,每天都有24小时,2,星期几这个是一个完整的循环,和年份月份都没有关系,是一直循环的。然后我们大概可以作出下面的计算模型。

background Layer 1 0:00 0:00 0:00 14:20 10:24 周天 周一 周二 周三 part1 part2

上面的模型什么意思呢?就是给任意的两个时间点,我们首先计算时间差,然后获得开始时间的星期数,因为星期数是一直循环的,因此,我们计算得到part1和part2就可以完成遍历。part1是开始时间距离当天24点还有多久,part2是结束时间离当天0点过了多久。

上面的模型是干什么的呢?上面的模型其实是将一个很长的时间片段根据每一天划分成多个小片段。例如上图,我就分成了4个时间片段,同时还可以快速知道每个时间片段是星期几。

不过要注意的是,每个时间片段都是从小时开始计算的,例如上图,4个片段是[14:20-24:00],[0:00-24:00],[0:00-24:00],[0:00-10:24],它们都是和日期无关的片段,这样是方便计算两个时间片段的交集。

background Layer 1 09:00 12:00 13:30 18:30 周内上班片段 选中的时间片段 10:00 14:00 交集时间片段 10:00 12:00 13:30 14:00

上图就是如何计算时间片段的示意图,假设我们的上班时间为[09:00-12:00]-[13:30-18:30],而我们的请假时间片段为[10:00-14:00],那么最终的交集为[10:00-12:00]和[13:00-14:00]。

计算方法就是用我们的请假片段去循环所有的上班片段,然后开始时间取大的,结束时间取小的。上面为例,首先用[10:00-14:00]和[09:00-12:00]去比较,开始时间为大的,所以为10:00,结束时间为小的,所以为12:00,固交集为[10:00-12:00],下午的时间片段取交集依旧如此。

上面两个点基本上就是重点了,第一个是将大的时间片段打散成小的时间片段,每个时间片段都在一天之内,第二个就是计算这个时间片段的交集。故而可以得到真正的时间差。

上面是实现的一个小demo,当你输入请假开始和结束时间就可以自动计算请假了多久以及请假的详细信息。

DEMO下载

点击下载 [0积分]一共下载0

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字