我以为我在找轮子,但我没有找到任何可以使用的。大部分问题很大,所以我写了一个需求描述,支持可选的时间段,即根据用户的工作和结束时间来确定开始时间和结束时间。返回技术栈moment.js的思路怎么说呢,其实逻辑也不是很复杂。主要是确定开始时间、结束时间、签到时间、签到时间之间的关系。设置begindate为工作时间开始时间>下班时间--->设置begindate为工作时间和日期+1结束时间>下班时间--->设置enddate为下班时间结束时间<工作时间--->将begindate设置为工作时间和日期-1,然后判断工作是否在同一天处理和开始。这是一般的想法。/****@param{*}ststart2018-02-0212:00*@param{*}etend2018-02-0212:00*@param{*}das在10点开始工作:00:00formatmust*@param{*}dax在10:00:00登录工作formatmust*/GetWorkHours(st,et,das,dax){vardas={h:das.substr(0,2),m:das.substr(3,2),s:das.substr(6,2)}vardax={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).分钟(das.m);}elseif(_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.米);}elseif(_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();如果(_week==0||_week==6){_DateTime.add(1,'d');继续;}如果(时刻(_DateTime).isSame(_beginDate,"day")){if(moment(_DateTime).isSame(_endDate,"day")){//开始时间和结束时间是同一天,结束时间-开始时间_totalHour+=_endDate.diff(_beginDate,“小时”,真);_DateTime.add(1,'d');继续;}else{//开始时间和结束时间不是同一天,et-st_totalHour+=moment(dax).diff(das,"hours",true);_DateTime.add(1,'d');继续;}}elseif(moment(_DateTime).isSame(_endDate,"day")){//是否与结束时间同一天,结束时间-开始时间st,_totalHour+=_endDate.diff(moment(_endDate).hour(das.h).minute(das.m),"小时",真);_DateTime.add(1,'d');继续;}else{//工作时间_totalHour+=moment.duration(moment(dax)-moment(das)).as('hours');_DateTime.add(1,'d');继续;}}console.log("Total",_totalHour)return_totalHour}细节可能有瑕疵,欢迎讨论
