JS 猎取一段时间内的事情时长小时数

本来想是想找轮子的,然则并没有找到能用的,多半都是题目很大,所以就本身写了一个

需求申明

支撑自选时候段,即最先时候与完毕时候
依据用户的上班及放工时候剖断
返回小时数

手艺栈

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 
    }

细节处能够另有瑕疵,迎接议论

    原文作者:Stan
    原文地址: https://segmentfault.com/a/1190000015841818
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞