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
}
细节处可能还有瑕疵,欢迎讨论
JS 获取一段时间内的工作时长小时数的更多相关文章
- sql 通过某段时间求得改段时间内的工作时长,排除工作日
CREATE FUNCTION Fun_GetTotalHourBySomeTime(@TaskId NVARCHAR(30),@Bu_trupstartDate NVARCHAR(50),@Bu_t ...
- java根据日期获取周几和获取某段时间内周几的日期
整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...
- oracle获取一段时间内所有的小时、天、月
获取一段时间内所有的小时 ) sdate FROM dual CONNECT ; 获取一段时间内所有的天 sdate FROM dual CONNECT ; from user_objects whe ...
- Java 获取一段时间内的每一天
有时候我们会遇到一些业务场景,需要去获取一段时间内的每一天日期 public static List<Date> findDates(Date dBegin, Date dEnd) { L ...
- js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总
在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要. 什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...
- c# 获取MP3和AMR文件格式的时长
//网上摘录整理private long GetAMRFileDuration(string fileName) { ; FileStream fs = new FileStream(fileName ...
- python 获取视频文件的大小,时长等
举例说明: import os import sys import xlwt from moviepy.editor import VideoFileClip file_dir = u"G: ...
- DB2获取有效工作时长函数(排除节假日、排除午休时间)
CREATE OR REPLACE FUNCTION DIFFHOURTIME_WITHOUTHOLIDAY_FUN ( STARTTIME ), ENDTIME ) ) RETURNS DOUBLE ...
- js 获取系统时间:年月日 星期 时分秒(动态)
最近再写一个纯html页面,有时间和天气的数据,天气后台给接口,时间要自己获取,我就自己弄了下, <div class="basic"></div> 这是放 ...
随机推荐
- 35)PHP,关于PHP和html
(1)其实无论是CSS还是js,又或者是html,都是可以随意的载入到我们的php文件中,其实这些文件就是一个外来的引入文件,所以,根本没有什么神奇的, 你要是想把php的结果有调理的展示,那么就直接 ...
- vue2.0学习之动画
下载animate.css <transition name="v"> <div class="content">需要做动画的内容< ...
- 让mybatis不再难懂(一)
与hibernate相比,我无疑更喜欢mybatis,就因为我觉得它真的好用,哈哈.它简单上手和掌握:sql语句和代码分开,方便统一管理和优化:当然缺点也有:sql工作量很大,尤其是字段多.关联表多时 ...
- OC门与OD门以及线与逻辑
OC(Open Collector)门又叫集电极开路门,主要针对的是BJT电路(从上往下依次是基极,集电极,发射极)OD(Open Drain)门又叫漏极开路门,主要针对的是MOS管(从上往下依次是漏 ...
- NIO与IO
待续... 该文章部分摘自:http://tutorials.jenkov.com/java-nio/index.html 一.I/O简介 I/O(英语:Input/Output),即输入/输出, 指 ...
- Visual Studio 2017部署方法
1.打开官网下载链接 https://www.visualstudio.com/zh-hans/downloads/ 2.选择适合的版本,选择下载,进入下载界面 如果无反应,点击请单击此处重试,开始下 ...
- 荼菜的iOS笔记--UIView的几个Block动画
前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...
- EventBus 3.0 的基本使用
EventBus 3.0 的基本使用 1.什么是EventBus? EventBus 是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间.组件与后台线程间 ...
- 2019-04-18-NFV基础概念
NFV技术的起源和概念 在移动互联网时代,运营商面临内外困局.就自身而言,采用的流量增长-网络扩容-收入增长的商业模型正在失效,庞大.僵化的电信基础网络,不能够满足用户的丰富需求:就竞争对手而言,互联 ...
- nginx: [emerg] unknown directive “ ” in /usr/local/nginx/conf/vhost/XXX.conf:53报错处理
开发同事发给我一小段nginx配置,加到服务器上之后,执行nginx -s reload时,出现报错: nginx: [emerg] unknown directive “ ” in /usr/loc ...