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

需求说明

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

技术栈

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. 吴裕雄--天生自然python机器学习:机器学习简介

    除却一些无关紧要的情况,人们很难直接从原始数据本身获得所需信息.例如 ,对于垃圾邮 件的检测,侦测一个单词是否存在并没有太大的作用,然而当某几个特定单词同时出现时,再辅 以考察邮件长度及其他因素,人们 ...

  2. tap点击一次,内部程序执行两次,多次

    调试过程发现,使用 $(document).on('tap', '.children2', function () { //内部程序 }) 点击children2的时候,程序在里面执行了两次.百度得到 ...

  3. $(document).ready()和window.onload方法

    引用:http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload ...

  4. sql执行过程

    作为一个程序员,几乎所有人都使用过 SQL 语言,无论是在命令行执行.程序调用,还是在 SQL 工具里,你都做过这样的事:写一个规范的 SQL 语句,然后等待数据库返回的结果,然后再基于结果做各种逻辑 ...

  5. Nginx笔记总结三:内核参数优化

    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800 net.ipv4.ip_conntrack_max = 16777216 ...

  6. python基础之文件操作1

    文件操作:os.mknod("test.txt")        创建空文件fp = open("test.txt",w)     直接打开一个文件,如果文件不 ...

  7. Java學習筆記(基本語法)

    本文件是以學習筆記的概念為基礎,用於自我的複習紀錄,不過也開放各位的概念指證.畢竟學習過程中難免會出現觀念錯誤的問題.也感謝各位的觀念指證. 安裝JDK 在Oracle網站中找自己系統的JDK下載位置 ...

  8. 方兴未艾的云计算:SoCC 2015大会

    ACM 云计算研讨会(ACM Symposium on Cloud Computing, 以下简称SoCC)是由SIGMOD(Special Interest Group on Management ...

  9. OSX编译安装Python3及虚拟开发环境Virtualenv

    0X00.前言 因为工作原因,最近主要做Python开发,刚好电脑系统重装之后所有的东西都需要重新配置.此文主要记录OSX下通过源码编译安装Python3以及安装虚拟开发环境Virtualenv. 0 ...

  10. 华为Mate 10牵手Microsoft Translator,让离线翻译可媲美在线神经网

    ​编者按:日前,华为新发布的Mate 10手机系列采用Microsoft Translator技术实现了AI驱动型离线翻译功能.华为Mate 10是首款具有NPU(专用神经处理单元)的手机,可用于加速 ...