使用javascript和jQuery UI日期选择器获取工作日数
我有两个日期选择器,从中我可以计算一天的数量,而不必计算周六和周日。但是我想在星期五和星期六做这个。我尝试过一些不同的方法,但失败了。对于我来说,处理星期六和星期天之外的天数很容易,但对于星期五和星期六则不容易。下面是我的javascript代码-使用javascript和jQuery UI日期选择器获取工作日数,javascript,datepicker,Javascript,Datepicker,我有两个日期选择器,从中我可以计算一天的数量,而不必计算周六和周日。但是我想在星期五和星期六做这个。我尝试过一些不同的方法,但失败了。对于我来说,处理星期六和星期天之外的天数很容易,但对于星期五和星期六则不容易。下面是我的javascript代码- $(function() { $( "#startDate" ).datepicker({ onSelect: calculateDays}); }); $(function() { $( "
$(function() {
$( "#startDate" ).datepicker({
onSelect: calculateDays});
});
$(function() {
$( "#endDate" ).datepicker({
onSelect: calculateDays});
});
function calculateDays(startDate, endDate) {
var form = this.form
var startDate = document.getElementById("startDate").value;
var startDate = new Date(startDate);
var endDate = document.getElementById("endDate").value;
var endDate = new Date(endDate);
startDate.setHours(0,0,0,1); // Start just after midnight
endDate.setHours(23,59,59,999); // End just before midnight
var oneDay = 24*60*60*1000;
var diff = endDate - startDate; // Milliseconds between datetime objects
var days = Math.ceil(diff / oneDay);
var weeks = Math.floor(days / 7);
var days = days - (weeks * 2);
// Handle special cases
var startDay = startDate.getDay();
var endDay = endDate.getDay();
// Remove weekend not previously removed.
if (startDay - endDay > 1)
days = days - 2;
// Remove start day if span starts on Sunday but ends before Saturday
if (startDay == 0 && endDay != 6)
days = days - 1
// Remove end day if span ends on Saturday but starts after Sunday
if (endDay == 6 && startDay != 0)
days = days - 1
if (days)
document.getElementById("result").innerHTML=days;
}
我的HTML是:
<form id="dateDifference" style="width:200px;">
<input name="startDate" id="startDate" value="" >
<input name="endDate" id="endDate" value="" >
</form>
<span id="result"></span>
javascript日期方法,getDay()将返回0表示星期天,1表示星期一,等等 您应该能够使用日期对象并检查一周中的当前日期,并将其从5(星期五)和6(星期六)的计数中排除 其中
d0
和d1
是开始和结束Date
对象(具有相同的小时值)。还有一种方法
for(var i = startDate ; i <= endDate ;i.setDate(i.getDate() + 1)){
if( i.getDay() != 6 && i.getDay() != 0)
{
days = days + 1;
}
}
for(var i=startDate;i如果要计算一年中的工作日数:
const monthWorkDays = (year, month) =>
new Array(32 - new Date(year, month, 32).getDate())
.fill(1)
.filter(
(id, index) =>
[0, 6].indexOf(
new Date(year, month, index + 1).getDay()) === -1
).length;
const yearWorkDays = (year) =>
new Array(12)
.fill(1)
.reduce((pv, cv, index) => pv + monthWorkDays(year, index), 0);
yearWorkDays(2017)
我知道。但我已经提到,计算没有周六和周日的天数很容易,因为周六的值最高(6)所以每次你计算从星期六开始的日差时,你会得到一个大于1的值,当日差小于一周(7天)时,你可以很容易地减去2天。但是,当我从星期五开始计算日期值为5时,这是非常困难的。很抱歉,英语不好。这段代码对我来说似乎有问题…取决于结束日期。函数calculateBizDays(sDate,eDate){var saturday=7;var sunday=1;sDate.setHours(23);//这应该是0,但服务器按小时关闭。sDate.setMinutes(0);sDate.getSeconds(0);eDate.setHours(0);//BPM休息一小时?为什么?eDate.setMinutes(59);eDate.getSeconds(59);var ndays=1+Math.round(((eDate.getTime()*1000)-sDate.getTime()/(24*3600*1000));var nsaturdays=Math.floor((ndays+sDate.getDay())/7);返回ndays-2*nsaturdays-(sDate.getDay())==星期天)-(eDate.getDay()==星期六);}我有一些问题(由于一些服务器日期问题),但我试图计算工作日(即不包括Sat和Sun),发现它根据结束日期给出了奇怪的结果。我所做的是用.setHours.ps设置d0和d1中的小时。忽略我乘以eDate.getTime()*1000,sDate.setHours应为0,而不是23,endHours应为23,而不是0。。lol@ppumkin在这种情况下,请参见我的C#解决方案:请注意,此方法跳过周六和周日。如果您希望从计算中排除特定日期,例如国家或银行假日,此方法将有所帮助。if语句可以在数组o中包含日期检查你自己打造的节日。
const monthWorkDays = (year, month) =>
new Array(32 - new Date(year, month, 32).getDate())
.fill(1)
.filter(
(id, index) =>
[0, 6].indexOf(
new Date(year, month, index + 1).getDay()) === -1
).length;
const yearWorkDays = (year) =>
new Array(12)
.fill(1)
.reduce((pv, cv, index) => pv + monthWorkDays(year, index), 0);
yearWorkDays(2017)