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
    }

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

原文地址:https://www.cnblogs.com/baimeishaoxia/p/11875332.html

时间: 2024-08-05 07:54:53

JS 获取一段时间内的工作时长小时数的相关文章

sql 通过某段时间求得改段时间内的工作时长,排除工作日

CREATE FUNCTION Fun_GetTotalHourBySomeTime(@TaskId NVARCHAR(30),@Bu_trupstartDate NVARCHAR(50),@Bu_trupEndDate NVARCHAR(50)) RETURNS FLOAT ASBEGIN --计算工作日的天数 DECLARE @tStartDate DATE DECLARE @tEndDate DATE SET @tStartDate=CONVERT(NVARCHAR(50),@Bu_tru

JS获取时间段内的工作时长

需求 1.给一个开始时间和结束时间: 2.计算在时间段内工作时间长度: 3.工作时间是9点-18点: 4.工作时长是8小时: 5.不记录周六和周日时间: 插件 使用了moment.js 代码 1 function GetWorkHours(beginDateTime, endDateTime) { 2 var _totalHour = 0; 3 //1.获取开始时间和结束时间之间的日 4 var _beginDate = moment(beginDateTime); 5 var _endDate

oracle获取一段时间内所有的小时、天、月

获取一段时间内所有的小时 SELECT to_date('2013-07-01 12', 'yyyy-mm-dd hh24') + (ROWNUM - 1) / 24 sdate FROM dual CONNECT BY ROWNUM <= (to_date('2013-07-02 22', 'yyyy-mm-dd hh24') - to_date('2013-07-01 12', 'yyyy-mm-dd hh24')) * 24 + 1; 获取一段时间内所有的天 SELECT to_date(

js获取某段的HTML

要JS获取某段JS,必须考虑就是获取HTML这个对象,实际很简单极端代码就实现. 页面中存在动态增加的数据,不能直接用HTML获取输入等标签的动态增加值.垃圾桶是用Ajax在当前页面上请求当前页面并返回整个页面的HTML...因为它是整个页面,它还包括文档声明垃圾桶唯一需要注意的是:InnerText和textcontent不能用于显示页面,否则将对它们进行分析.InnerText和textcontent是FF和FF以外的浏览器之间的区别. : 简单实现代码如下<script language=

请给出程序,功能为获取“一段程序代码”运行时长

有一天看到了几个java题目,我就写了一下,废话少说,直接上代码了 3.已知int型数组arr[t], 请:① 打印该数组.输出格式为:[arr1,arr2,arr3,...]. ② 输出数组的最大值max与最小值min. ③ 使用冒泡排序对数组进行排序,并打印排序后数组. 4. 请给出程序,功能为获取“一段程序代码”运行时长.要求: ① 程序框架在父类中定义. ② “一段程序代码”在子类中给出,并覆盖父类中对应方法. ③ “一段程序代码”为:打印一个由“*”组成的图形,见图1. 图1 第三题:

3星|《工作生活双全法则》:我们很容易掉入注重工作时长而非成果的陷阱

工作生活双全法则(<哈佛商业评论>增刊) 工作生活双全法则(<哈佛商业评论>增刊) <哈佛商业评论>讲兼顾工作与生活的3篇文章.总体来说,这在全世界都是个难题.作者的调查和统计结果表明,有些时候工作的压力来自于公司对工作时长的关注超过了对工作成果的关注. 以下是书中一些内容的摘抄: 1:上述两位作者基于对全球4000名高管的访谈,发现成功的高管往往能巧妙地将工作和家庭融合在一起,这样他们就在取得职业成就的同时,保持了与家庭成员的和谐关系.#16 2:最后一点是高管的普遍

js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总

在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息,它被浏览器自动地放置在访问用户的电脑硬盘中. 例如:C:\Users\[user]\AppData\Roaming\Microsoft\Windows\Cookies 如上图所示,打开的一个文件里面,标示了一个域下多个Cookie的信息. 检测/判断浏览器是否支持Cookie 在绝大多数浏览器中,可

PHP获取一段时间内的每个周几, 每月几号, 遇到特殊日子就往后延

2016年11月1日 16:18:19 星期二 主要用到的函数是 strtotime() strtotime('+1 Tuesday', $timestamp) 获取下周二, 从时间戳$timestamp开始计算, 如果$timestamp留空, 则从当天开始计算 strtotime('+1 month', $timestamp) 获取下个月的x号, 还是以$timestamp开始计算的 1 /** 2 * desc 获取每周X执行的所有日期 3 * @param string $start 开

获取一段时间内的所有日期

public static List Day(String begin, String end) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); List strDate = new ArrayList(); strDate.add(begin) Calendar calendar = Calendar.getInstance(); calendar.setTime(sdf.parse(begin)) boolea