资讯专栏INFORMATION COLUMN

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

willin / 1433人阅读

摘要:本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个需求说明支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数技术栈思考过程怎么说呢,其实这个逻辑不是很复杂主要是确定起始时间结束时间与打卡上

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

需求说明

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

技术栈

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 
    }

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96490.html

相关文章

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

    摘要:本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个需求说明支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数技术栈思考过程怎么说呢,其实这个逻辑不是很复杂主要是确定起始时间结束时间与打卡上 本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班...

    alexnevsky 评论0 收藏0
  • JS 获取一段时间内的工作时长时数

    摘要:本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个需求说明支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数技术栈思考过程怎么说呢,其实这个逻辑不是很复杂主要是确定起始时间结束时间与打卡上 本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班...

    raoyi 评论0 收藏0
  • 【云主机 UHost】购买指导:计费模式、配置变更、续费和回收

    摘要:计费模式云主机支持以下几种计费方式按年,按月,按时均为预付费按年以年为计费周期支付订单。续费有效期过期产品的续费。二按时预付费云主机过期后当天发送已过期提醒过期第天发送资源即将被回收通知过期后第天发送回收通知,并回收主机。UHost计费模式1、云主机UHost支持以下几种计费方式:按年,按月,按时(均为预付费)按年:以年为计费周期支付订单。享受每年订单减免2个月费用的优惠。按月:以月为计费周...

    Tecode 评论0 收藏0
  • 个推应用统计产品(个数)Android集成实践

    摘要:自定义事件主要分为两种次数统计统计指定行为被触发的次数。目前个数的自定义事件有两种次数统计事件在事件执行开始时调用次数统计方法,会根据事件,统计该事件被点击的次数。 前段时间,我们公司的产品又双叒叕给我们提了新需求,要求我们把APP相关的数据统计分析一下,这些指标包括但不限于应用每日的新增、活跃、留存率等等,最好每天都能提供数据报表。这种事情真是想想就麻烦,大家最后还是决定交给专业的团...

    taoszu 评论0 收藏0
  • 【云主机 UHost】产品简介:什么是云主机?UHost产品优势,功能简介与计费说明

    摘要:计费说明云主机产品目前支持按年按月按时预付费和按时后付费四种计费方式。此外,云盘费用与主机开关机状态无关,按照完整的小时计费。举例用户于购买成功后付费云主机,系统将于生成时间段内的后付费订单,并以此类推。什么是云主机云主机提供可随时扩展的计算服务,每台云主机以虚拟机的形式运行,主机资源包含CPU、内存、磁盘等最基础的计算组件。云主机是UCloud最为核心的服务,有些服务,如IP、镜像、云硬盘...

    Tecode 评论0 收藏0

发表评论

0条评论

阅读需要支付1元查看
<