我一直在与OrangeHRM合作开展一个项目。它使用Yui日历。我一直在研究休假模块。 Leave模块允许用户选择From和To Date - 他想要申请休假的时间范围!
我想在用户选择日期后显示工作日数。一个简单的减法语句不起作用,因为我想从方程式中排除星期六和星期日,因为它们不算作工作日!
function fillToDate(frmLeaveApp) {
var fromdate = frmLeaveApp.elements['txtLeaveFromDate'];
var todate = frmLeaveApp.elements['txtLeaveToDate'];
var result = frmLeaveApp.elements['txtLeaveTotalDay'];
if(!fromdate || !todate || !result) {
return;
}
var a = fromdate.value;
var b = todate.value;
var c = a.split('-');
var d = b.split('-');
var ac = new Date();
ac.setFullYear(c[2], c[1], c[0]);
var bd = new Date();
bd.setFullYear(d[2], d[1], d[0]);
result.value = (bd.getTime() - ac.getTime()) / (60*60*24*1000);
}
我该怎么办?提前致谢 !
答案 0 :(得分:0)
对这个解决方案不是超级自豪 - 必须是更优雅的方式,但它应该工作 - 不处理国定假日
function fillToDate(frmLeaveApp) {
var fromdate = frmLeaveApp.elements['txtLeaveFromDate'];
var todate = frmLeaveApp.elements['txtLeaveToDate'];
var result = frmLeaveApp.elements['txtLeaveTotalDay'];
if(!fromdate || !todate || !result) {
return;
}
var from = new Date(fromdate.value.replace(/\-/g,"/"));
var to = new Date(todate.value.replace(/\-/g,"/"));
// brute force seems the quickest to find
var res = 0;
var aDay = 24*60*60*1000;
for (var i = from.getTime(), n=to.getTime();i < n; i+=aDay) {
var d = new Date(i).getDay();
if (d!=0 && d !=6) res++;
}
result.value = res;
}
答案 1 :(得分:0)
一个不太好的简单解决方案:)
在YUI日历中,所选日期单元格已“选中”类。
星期六的小区有'wd6',星期天有'wd0'级别。
获取所有已选中“类”的单元格并过滤并删除具有“wd6”和“w0”类的单元格。
var cells = Y.one("#calContainer").all('.selected');
var res = 0;
for (var i = 0, i < cells.length; i++) {
if (!cells[i].hasClass('.wd6') || !cells[i].hasClass('.wd0')) res++;
}
return res;
我还没有测试过这段代码。
答案 2 :(得分:0)
这里有一些事情。首先,要使两个日期之间的天数远远超过已经提供的天数:
/*
Get the number of days between two dates - not inclusive.
"between" does not include the start date, so days
between Thursday and Friday is one, Thursday to Saturday
is two, and so on. Between Friday and the following Friday is 7.
e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.
If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
use date prior to start date (i.e. 31/12/2010 to 30/1/2011).
Only calculates whole days.
*/
function getDaysBetweenDates(d0, d1) {
var msPerDay = 8.64e7;
// Copy dates so don't mess them up
var x0 = new Date(d0);
var x1 = new Date(d1);
// Set to noon - avoid DST errors
x0.setHours(12,0,0);
x1.setHours(12,0,0);
// Round to remove daylight saving errors
return Math.round( (x1 - x0) / msPerDay );
}
要获取“营业”天数,计算整周数,乘以5,然后在开始和结束时调整剩余天数和周末数。如果要包括开始日期(通常为休假),请在指定日期前一天使用开始日期。例如2011年7月4日至2011年7月8日星期五的休假申请是休假5天。
另一方面,来自 2011年7月4日星期一的5个工作日通常是2011年7月11日星期一,但可能是2011年7月8日星期五的COB。根据当地习俗,法律先例,合同协议等,这些事情的规则可能会有所不同。
此外,这种简单的算法无论如何都很少。公共假期搞砸了,不同地方的不同工作周也是如此。有些是周六到周三 - 周四和周五是“周末”。在其他地方,星期六是工作日(每周6天)。此外,公众假期可能会在周末出现。
/*
Simple algorithm: each week has 5 business days: Monday
to Friday inclusive. Saturday and Sunday are non-working
days.
*/
function getBusinessDaysBetweenDates(d0, d1) {
var days = getDaysBetweenDates(d0, d1);
var bWeeks = (days/7)|0;
var rDays = days%7;
var startDay = d0.getDay();
var endDay = d1.getDay();
// If not whole weeks, adjust for weekends
if (rDays) {
// Adjust for start on weekend, end any day
if (startDay == 6) {
rDays -= 1;
} else if(startDay == 5) {
rDays -= (rDays == 1)? 1 : 2;
// Adjust for start on business day
// and end on weekend
} else if (endDay == 6) {
rDays -= 1;
// Adjust for going over whole weekend
} else if (endDay < startDay) {
rDays -= (rDays == 1)? 1 : 2;
}
}
return bWeeks * 5 + rDays;
}
如果您希望包含周一至周五的公共假期,则需要使用公共假期日历的其他功能,并返回主题日期之间的工作日数。特定行业,专业,宗教等也可能有假期。