本来想是想找*的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个
需求说明
支持自选时间段,即开始时间与结束时间
根据用户的上班及下班时间判定
返回小时数
技术栈
moment.js
思考过程
怎么说呢,其实这个逻辑不是很复杂
主要是确定起始时间、结束时间与打卡上班时间、打卡下班时间的关系问题
起始时间<上班时间 ---> 将begindate设置成上班时间
起始时间>下班时间 ---> 将begindate设置成上班时间 并且日期+1
结束时间>下班时间 ---> 将enddate设置成下班时间
结束时间<上班时间 ---> 将begindate设置成上班时间 并且日期-1
然后就是判断是不是工作日了
起始是否同一天
大概思路就是这样 嗯
/**
*
* @param {*} st start 2018-02-02 12:00
* @param {*} et end 2018-02-02 12:00
* @param {*} das 打卡上班 10:00:00 格式必须
* @param {*} dax 打卡下班 10:00:00 格式必须
*/
GetWorkHours( st, et, das, dax) {
var das = {h:das.substr(0,2),m:das.substr(3,2),s:das.substr(6,2)}
var dax = {h:dax.substr(0,2),m:dax.substr(3,2),s:dax.substr(6,2)}
var _totalHour = 0;
//获取开始时间和结束时间
var _beginDate = moment(st);
var _endDate = moment(et);
var _begin = {y:_beginDate.year(),M:_beginDate.month(),d:_beginDate.date()}
var _end = {y:_endDate.year(),M:_endDate.month(),d:_endDate.date()}
//整理
if (_beginDate.isBefore(moment(Object.assign({},_begin,das)))) {
//开始时间小于st,设置为st
_beginDate.hour(das.h).minute(das.m);
} else if (_beginDate.isAfter(moment(Object.assign({},_begin,dax)))) {
_beginDate.add(1, 'd').hour(das.h).minute(das.m);
}
if (_endDate.isAfter(moment(Object.assign({},_end,dax)))) {
//结束时间大于et,设置为et
_endDate.hour(dax.h).minute(dax.m);
} else if (_endDate.isBefore(moment(Object.assign({},_begin,das)))) {
_beginDate.add(-1, 'd').hour(das.h).minute(das.m);
}
var _DateTime = _beginDate;
while (moment(_DateTime).isSameOrBefore(_endDate, "day")) {
//判断是否周日,周六
var _week = moment(_DateTime).weekday();
if (_week == 0 || _week == 6) {
_DateTime.add(1, 'd');
continue;
}
if (moment(_DateTime).isSame(_beginDate, "day")) {
if (moment(_DateTime).isSame(_endDate, "day")) {
//开始时间和结束时间是同一天,结束时间-开始时间
_totalHour += _endDate.diff(_beginDate, "hours", true);
_DateTime.add(1, 'd');
continue;
} else {
//开始时间和结束时间不是同一天,et-st
_totalHour += moment(dax).diff(das, "hours", true);
_DateTime.add(1, 'd');
continue;
}
} else if (moment(_DateTime).isSame(_endDate, "day")) {
//是否和结束时间是同一天,结束时间-开始时间st,
_totalHour += _endDate.diff(moment(_endDate).hour(das.h).minute(das.m), "hours", true);
_DateTime.add(1, 'd');
continue;
} else {
//工时
_totalHour += moment.duration(moment(dax)-moment(das)).as('hours');
_DateTime.add(1, 'd');
continue;
}
}
console.log("总计", _totalHour)
return _totalHour
}
细节处可能还有瑕疵,欢迎讨论