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

需求说明

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

技术栈

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
}

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

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

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

    CREATE FUNCTION Fun_GetTotalHourBySomeTime(@TaskId NVARCHAR(30),@Bu_trupstartDate NVARCHAR(50),@Bu_t ...

  2. java根据日期获取周几和获取某段时间内周几的日期

    整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...

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

    获取一段时间内所有的小时 ) sdate FROM dual CONNECT ; 获取一段时间内所有的天 sdate FROM dual CONNECT ; from user_objects whe ...

  4. Java 获取一段时间内的每一天

    有时候我们会遇到一些业务场景,需要去获取一段时间内的每一天日期 public static List<Date> findDates(Date dBegin, Date dEnd) { L ...

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

    在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...

  6. c# 获取MP3和AMR文件格式的时长

    //网上摘录整理private long GetAMRFileDuration(string fileName) { ; FileStream fs = new FileStream(fileName ...

  7. python 获取视频文件的大小,时长等

    举例说明: import os import sys import xlwt from moviepy.editor import VideoFileClip file_dir = u"G: ...

  8. DB2获取有效工作时长函数(排除节假日、排除午休时间)

    CREATE OR REPLACE FUNCTION DIFFHOURTIME_WITHOUTHOLIDAY_FUN ( STARTTIME ), ENDTIME ) ) RETURNS DOUBLE ...

  9. js 获取系统时间:年月日 星期 时分秒(动态)

    最近再写一个纯html页面,有时间和天气的数据,天气后台给接口,时间要自己获取,我就自己弄了下, <div class="basic"></div> 这是放 ...

随机推荐

  1. Maven 仓库搜索服务和私服搭建

    Maven 仓库搜索服务 使用maven进行日常开发的时候,一个常见问题就是如何寻找需要的依赖,我们可能只知道需要使用类库的项目名称,但是添加maven依赖要求提供确切的maven坐标,这时就可以使用 ...

  2. Linux基本操作_20191117

    VMware和Ubuntu的安装, 想来想去,还是需要安装,不能老是使用Windows的,后面还有很多都要用到Linux系统的,这个可以说是开发人员必备的了, 基本的使用: 1,Windows下面C: ...

  3. z-scores|zα

    6.2 Areas Under the Standard Normal Curve Property 4: Almost all the area under the standard normal ...

  4. A4988驱动42步进电机

    A4988步进电机驱动器驱动控制42步进电机速度,步进电机调速,调节驱动电流       1  A4988步进电机驱动器简介 方便使用,是我们这些用户最想要的,固有的名词和深入介绍在这就不多说了,您可 ...

  5. Qt5 提示:无法启动此程序,计算机丢失Qt5Widgetsd.dll的解决方法

    Qt5工程编译生成可执行的exe文件之后,运行提示无法启动此程序,计算机丢失Qt5Widgetsd.dll… 原因是没有设置好Qt5的环境变量,解决方法如下: 1.打开[环境变量],(不同的系统会有不 ...

  6. js mvvm:闲来无事,实现一个只具最基本数据双向绑定的mvvm

    近期项目内用knockoutjs. 想模拟实现数据双向绑定的基本功能. 只具有最基本的功能,且很多细节未曾考虑,也未优化精简. 能想到的缺少的模块 1事件监听,自定义访问器事件 2模版 3父子级 编码 ...

  7. python django 模板语言循环字典

    urls.py from django.conf.urls import url from django.contrib import admin from cmdb import views url ...

  8. FastJson的学习之JSON互相转Map集合,List集合,JavaBean

    https://blog.csdn.net/weixin_36910300/article/details/79182120 创建两个实体类 一个是部门类,一个是部门员工类 部门员工类 public ...

  9. 在腾讯云centos7.2上安装配置Node.js记录

    应为爱好前端所以打算在腾讯云服务器上安装JavaScript引擎Node.js,下面是安装步骤: 安装准备: 下载node.js的.tar.xz安装包:https://nodejs.org/dist/ ...

  10. JAVA中String类的比较

    首先给大家看一段代码 package javaapptest; public class JavaAppTest { public static void main(String[] args) { ...