ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JS 获取一段时间内的工作时长小时数

2019-11-17 09:02:57  阅读:330  来源: 互联网

标签:小时数 endDate beginDate JS 获取 moment das DateTime dax


本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个

需求说明

支持自选时间段,即开始时间与结束时间
根据用户的上班及下班时间判定
返回小时数

技术栈

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 
    }

细节处可能还有瑕疵,欢迎讨论

标签:小时数,endDate,beginDate,JS,获取,moment,das,DateTime,dax
来源: https://www.cnblogs.com/baimeishaoxia/p/11875332.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有