JS实现请假时长计算(计算小时数差)

给公司做了一套系统,涉及到请假单功能开发。在计算请假时长这块总结一下:按天计算的就不总结了比较简单,这里总结一下按小时数计算的 ,话不多说,直接上代码

// 获取两个日期相差的工作小时(不包括节假日)
function getHour(StartTime, EndTime) {
	StartTime = new Date(StartTime.replace(/-/g, '/'));
	EndTime = new Date(EndTime.replace(/-/g, '/'));
	var ms = Math.abs(EndTime.getTime() - StartTime.getTime());
	// 实际工时(天) = 起止日期差 - 周六日数目。
	if ((StartTime.getMonth() == EndTime.getMonth())
			&& (StartTime.getDate() == EndTime.getDate())) {
		// 若为同一日期
		var hour1 = (getDayHour(StartTime.getHours(), StartTime.getMinutes(),
				EndTime.getHours(), EndTime.getMinutes(), "1")).toFixed(1);
		$("#xxtj").val(hour1.substring(0,hour1.length-2));// 按天计算
		return hour1;
	} else {
		var sh=StartTime.getHours();
		var eh= EndTime.getHours();
		if (13 <= sh) {
			if (8 <= eh && eh <= 12) {
				var days = Math.ceil(ms / 1000 / 60 / 60 / 24) + 1;
			}else{
				var days = Math.floor(ms / 1000 / 60 / 60 / 24) + 1;
			}
		} else {
			var days = Math.floor(ms / 1000 / 60 / 60 / 24) + 1;
		}
		var workDayVal = 0;
		// 工时的余数
		var remainder = days % 7;
		// 工时向下取整的除数
		var divisor = Math.floor(days / 7);
		var weekendDay = 2 * divisor;

		// 起始日期的星期,星期取值有(1,2,3,4,5,6,0)
		var nextDay = StartTime.getDay();
		// 从起始日期的星期开始 遍历remainder天
		for (var tempDay = remainder; tempDay >= 1; tempDay--) {
			// 第一天不用加1
			if (tempDay == remainder) {
				nextDay = nextDay + 0;
			} else if (tempDay != remainder) {
				nextDay = nextDay + 1;
			}
			// 周日,变更为0
			if (nextDay == 7) {
				nextDay = 0;
			}
			// 周六日
			if (nextDay == 0 || nextDay == 6) {
				weekendDay = weekendDay + 1;
			}
		}
		workDayVal = days - weekendDay - 2;
		var hour0 = (workDayVal * 8 + getDayHour(StartTime.getHours(),
				StartTime.getMinutes(), EndTime.getHours(), EndTime
						.getMinutes(), "0")).toFixed(1);
		$("#xxtj").val(hour0.substring(0,hour0.length-2));// 按天计算
		return hour0;
	}
}
function getDayHour(sh, sm, eh, em, type) {
	sh = parseInt(sh);
	eh = parseInt(eh);
	if (type == "0") {
		// 计算非当天
		if (8 <= sh && sh <= 12) {
			sh = 12 - sh + 4;
		} else if (13 <= sh && sh <= 17) {
			sh = 17 - sh;
		}
		if (8 <= eh && eh <= 12) {
			eh = eh - 8;
		} else if (13 <= eh && eh <= 17) {
			eh = eh - 13 + 4;
		}
		return parseFloat(sh + eh);
	} else {
		// 计算当天
		if (sh == eh) {
			// 在同一小时
			if (sm == em) {
				return 0;
			} else {
				return Math.abs((sm - em) / 60);
			}
		} else {
			// 不在同一小时
			// 开始时间在上午时间段,并且结束时间在下午时间段
			if ((8 <= sh && sh <= 12) && (13 <= eh && eh <= 17)) {
				if (sm == 30) {
					return parseFloat(12 - sh + eh - 13);
				} else if (sm < 30) {
					return parseFloat(12 - sh + eh - 13);

				} else if (sm > 30 && sh != 12) {
					return parseFloat(12 - sh - 1 + eh - 13);
				}
			}
			// 开始时间与结束时间都在上午时间段
			if ((8 <= sh && sh <= 12) && (8 <= eh && eh <= 12)) {

				if (sm == em) {
					return parseFloat(Math.abs(eh - sh));
				} else {

					return parseFloat(Math.abs(eh - sh - 1) + (60 - sm) / 60
							+ em / 60);
				}

			} else if (13 <= sh && sh <= 17 && 13 <= eh && eh <= 17) {
				if (sm == em) {
					return parseFloat(Math.abs(eh - sh));
				} else {

					return parseFloat(Math.abs(eh - sh - 1) + (60 - sm) / 60
							+ em / 60);
				}
			}
		}
	}
}

 

因为都是整点的请,分钟数就不算了 。如有不对的地方,欢迎指教 !

 

在Vue.js计算请假时长,需要排除周六日以及放假日期。可以通过以下步骤来实现: 1.首先,我们需要在Vue组件中定义一个请假开始日期和结束日期的数据项,可以使用`data`选项来声明这两个数据项。 2.接下来,我们可以使用Vue提供的日期处理库(如`moment.js`)来进行日期计算。你可以使用`npm`安装moment.js库。 3.在计算请假时长的方法中,首先需要判断开始日期和结束日期是否在周六日或放假日期,如果是,则将其排除在外。 4.然后,我们可以使用moment.js库的`diff`方法来计算请假天数。将结束日期与开始日期相减,并将结果放入一个变量中。 5.最后,我们可以在Vue模板中显示计算出的请假天数。你可以使用插值表达式(`{{}}`)来显示这个变量。 下面是一个简单的Vue组件代码示例: ```javascript <template> <div> <input type="date" v-model="startDate" @input="calculateLeaveDuration" /> <input type="date" v-model="endDate" @input="calculateLeaveDuration" /> <p v-if="leaveDuration !== null">{{ leaveDuration }}天</p> </div> </template> <script> import moment from 'moment'; export default { data() { return { startDate: '', endDate: '', leaveDuration: null, }; }, methods: { calculateLeaveDuration() { // 排除周六日和放假日期 const excludedDates = ['2022-01-01', '2022-01-02']; // 假设这里放假的日期是2022年1月1日和2日 const start = moment(this.startDate); const end = moment(this.endDate); let leaveDuration = end.diff(start, 'days'); // 遍历排除日期并减去请假天数 excludedDates.forEach((date) => { if (moment(date).isBetween(start, end, 'day', '[]')) { leaveDuration--; } }); this.leaveDuration = leaveDuration; }, }, }; </script> ``` 在上面的示例中,我们通过在模板中使用两个日期输入框来选择请假的开始日期和结束日期。使用`v-model`指令将日期值绑定到Vue实例的数据属性上。 `@input`事件监听日期输入框的输入变化,一旦日期有改变,就会触发`calculateLeaveDuration`方法重新计算请假天数。 `calculateLeaveDuration`方法中,我们首先创建了Moment对象来表示开始日期和结束日期。然后使用Moment.js的`diff`方法计算请假天数。 随后,我们遍历排除日期数组,并使用Moment.js的`isBetween`方法判断排除日期是否在请假期间。如果是,则将请假天数减1。 最后,我们将计算出的请假天数赋值给`leaveDuration`属性,并在模板中显示出来。 请确保在项目中引入和使用Moment.js库。由于Moment.js在2020年停止维护,你也可以考虑使用Day.js等替代方案。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值