OA系统 简易请假时长算法
oa系统工作日(只限周一到周五,不包含节假日),员工请假时长简易算法
请假时长算法一般包括以下几个步骤:
- 获取请假开始时间和结束时间;
- 计算请假天数;
- 判断是否跨越非工作日;
- 根据公司规定的请假扣除规则,计算请假时长。
具体的算法可以按照以下步骤进行实现:
- 首先,获取请假开始时间和结束时间,并将其转换为日期对象;
- 计算请假天数;
- 判断请假期间是否跨越非工作日,可以使用日期计算库提供的判断工作日的函数;
- 根据公司规定的请假扣除规则,例如全天请假按照8小时计算,半天请假按照4小时计算,进行请假时长的计算。
请注意,在实际应用中,具体的请假时长算法可能会根据公司的具体需求和规定进行调整和修改。
// An highlighted block
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="token" content="123456">
<title>Document</title>
<style>
.box{
width: 300px;
height: 300px;
border-radius: 10px;
box-shadow: 10px 10px 20px rgb(73, 72, 72);
padding: 30px;
font-size: 16px;
}
.box ul{
margin: 0 auto;
}
.box ul li{
height: 40px;
line-height:40px;
list-style: none;
}
.box ul li input{
height: 30px;
line-height: 30px;
padding-left: 10px;
}
#time1{
width: 100px;
font-weight: 800;
}
button{
background-color: rgb(18, 150, 238);
color: #fff;
border: 0 none;
padding: 10px 40px;
margin:5px 0;
}
button:hover{
box-shadow: 2px 2px 5px #000;
}
</style>
</head>
<body>
<div class="box">
<ul>
<li>开始时间:</li>
<li><input type="text" id="startTime" value="2023-12-11 08:30"></li>
<li>结束时间:</li>
<li><input type="text" id="endTime" value="2023-12-11 09:00"></li>
<button id="btn" onclick="getWeekday()">计算</button>
<li>时长:<input type="text" id="time1"></li>
</ul>
</div>
<script>
window.onload = function () {
// 请假总时长
let askTime = 0;
const workStartTime = ' 08:30';
const restStartTime = ' 12:30';
const workStartTime1 = ' 14:00';
const workendTime = ' 18:00';
function getAskTime(e) {
var startDt = document.getElementById('startTime').value;
var endDt = document.getElementById('endTime').value
// var startDt = '2023-12-11 09:00';
// var endDt = '2023-12-13 09:00';
if (startDt && endDt) {
var first = new Date(startDt);
var last = new Date(endDt);
let start830 = new Date(new Date(getTodayDate(first, 1)).getTime() - 4 * 60 * 60 * 1000).getTime();
let start180 = new Date(getTodayDate(first, 2)).getTime();
let end830 = new Date(new Date(getTodayDate(last, 2)).getTime() - 9.5 * 60 * 60 * 1000).getTime();
let end180 = new Date(getTodayDate(last, 2)).getTime();
// 判断是否在工作时间内
if (first.getTime() < start830 || first.getTime() > start180 || last.getTime() < end830 || last
.getTime() > end180) {
alert('不在工作时间范围内')
} else {
// 同一天
if (first.toLocaleDateString() == last.toLocaleDateString()) {
// 工作日
if (new Date(first).getDay() >= 1 && new Date(first).getDay() <= 5) {
const restTime = new Date(getTodayDate(first, 1)).getTime(); // 12:30
const restSTime = new Date(getTodayDate(first, 3)).getTime(); // 14:00
const endTime = new Date(getTodayDate(first, 2)).getTime(); // 18:00
first = first.getTime();
last = last.getTime();
// 开始时间 < 12:30 结束时间<=12:30
if (first < restTime && last <= restTime) {
askTime = (last - first) / 3600000;
} else if (first < restTime && last >= restTime && last <= restSTime) {
// 开始时间 < 12:30 12:30>=结束时间<=14:00
askTime = (restTime - first) / 3600000;
} else if (first < restTime && last > restSTime) {
// 开始时间 < 12:30 结束时间 > 14:00
askTime = (restTime - first) / 3600000 + (last - restSTime) / 3600000;
} else if (first >= restSTime && last <= endTime) {
// 开始时间 >= 14:00 结束时间 <= 18:00
askTime = (last - first) / 3600000;
} else {
// 12:30<开始时间 <= 14:00 结束时间 <= 18:00
askTime = (last - restSTime) / 3600000;
}
document.getElementById('time1').value = askTime;
} else {
// 不是工作日 仅限周一到周五,没有算节假日
alert('请选择工作日')
}
} else {
//计算工作日方法:遍历这两个日期区间的每一个日期,获取他的getDay()
//分别获取first和last的毫秒数(时间戳)
first = first.getTime();
last = last.getTime();
var count = 0;
let startTime;
while (first <= last) {
//first在遍历过程中,就是两个日期区间中的每一个日期
//将first转换成日期对象
var d = new Date(first);
if (count == 0) {
d = new Date(first);
} else {
d = new Date(startTime);
}
//判断是否为工作日
if (new Date(first).getDay() >= 1 && new Date(first).getDay() <= 5) {
const dayTime = new Date(getTodayDate(d, 2));
if (last > dayTime.getTime()) {
if (count == 0) {
startTime = getDays(dayTime, d, first);
if (first < new Date(getTodayDate(d, 1)).getTime()) {
// 如果请假时间为上午,8:30-12:30
const morningTime = (new Date(getTodayDate(d, 1)).getTime() -first) / 3600000; // 上午时长
const afternoonTime = (dayTime.getTime() - new Date(getTodayDate(d, 3)).getTime()) / 3600000; // 下午时长
askTime = morningTime + afternoonTime;
} else if (first > new Date(getTodayDate(d, 3)).getTime()) {
// 如果请假时间为下午,14:00-18:00
askTime = (dayTime.getTime() - first) / 3600000;
} else if (first < new Date(getTodayDate(d, 3)).getTime() && first >new Date(getTodayDate(d, 1)).getTime()) {
// 如果请假开始时间在中午休息时间12:30-14:00
askTime = 4;
}
} else {
startTime = getDays(dayTime, d, startTime);
askTime += 8;
}
} else {
if (last <= new Date(getTodayDate(d, 1)).getTime() && last > (new Date(getTodayDate(d, 1)).getTime() - 4 * 60 * 60 * 1000)) {
// 如果请假时间为上午,8:30-12:30
askTime += (last - (new Date(getTodayDate(d, 1)).getTime() - 4 * 60 *60 * 1000)) / 3600000;
} else if (last < new Date(getTodayDate(d, 3)).getTime() && last > new Date(getTodayDate(d, 1)).getTime()) {
// 如果请假结束时间在12:30-14:00
askTime += 4;
} else if (last >= new Date(getTodayDate(d, 3)).getTime()) {
// 如果请假时间为下午,14:00-18:00
const afternoonTime = (last - new Date(getTodayDate(d, 3)).getTime()) /3600000;
askTime = askTime + afternoonTime + 4;
}
}
count++;
document.getElementById('time1').value = askTime;
}
//增加一天
first += 24 * 3600 * 1000;
}
}
}
}
}
function getTodayDate(date, mask) {
const year = date.getFullYear();
let month = date.getMonth() + 1;
let strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
let timeMask;
if (mask == 1) {
timeMask = restStartTime;
} else if (mask == 2) {
timeMask = workendTime;
} else if (mask == 3) {
timeMask = workStartTime1;
}
const currentdate = year + '-' + month + '-' + strDate + timeMask;
return currentdate;
}
function getDays(dayTime, d, time) {
let times = (dayTime.getTime() - time) / 3600000;
const year = d.getFullYear();
let month = d.getMonth() + 1;
let strDate = d.getDate() + 1;
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
let startTime = year + '-' + month + '-' + strDate + workStartTime
return startTime
}
var btn = document.getElementById('btn');
btn.onclick = function () {
getAskTime()
}
}
</script>
</body>
</html>