使用JavaScript向日期添加工作日
如何使用JavaScript添加工作日(即周一至周五),并在必要时自动添加周末使用JavaScript向日期添加工作日,javascript,Javascript,如何使用JavaScript添加工作日(即周一至周五),并在必要时自动添加周末 因此,如果我在今天(2016年11月22日星期二)加上5个工作日,结果应该是“2016年11月29日星期二”,而不是“2016年11月27日星期日”。可以使用日期设置日期功能(与获取日期)在日期上加上天数,即- var myDate = new Date(); // Tue 22/11/2016 myDate.setDate(myDate.getDate() + 3); // Fri 25/11/2016 因此,一
因此,如果我在今天(2016年11月22日星期二)加上5个工作日,结果应该是“2016年11月29日星期二”,而不是“2016年11月27日星期日”。可以使用
日期设置日期功能(与获取日期)在日期上加上天数,即-
var myDate = new Date(); // Tue 22/11/2016
myDate.setDate(myDate.getDate() + 3); // Fri 25/11/2016
因此,一旦您计算了工作日周期内的周末天数,您可以将其和所需的工作日数添加到开始日期,以获得最终日期
这一功能应该可以发挥作用,尽管这显然不会考虑到国定假日-
function addWorkDays(startDate, days) {
if(isNaN(days)) {
console.log("Value provided for \"days\" was not a number");
return
}
if(!(startDate instanceof Date)) {
console.log("Value provided for \"startDate\" was not a Date object");
return
}
// Get the day of the week as a number (0 = Sunday, 1 = Monday, .... 6 = Saturday)
var dow = startDate.getDay();
var daysToAdd = parseInt(days);
// If the current day is Sunday add one day
if (dow == 0)
daysToAdd++;
// If the start date plus the additional days falls on or after the closest Saturday calculate weekends
if (dow + daysToAdd >= 6) {
//Subtract days in current working week from work days
var remainingWorkDays = daysToAdd - (5 - dow);
//Add current working week's weekend
daysToAdd += 2;
if (remainingWorkDays > 5) {
//Add two days for each working week by calculating how many weeks are included
daysToAdd += 2 * Math.floor(remainingWorkDays / 5);
//Exclude final weekend if remainingWorkDays resolves to an exact number of weeks
if (remainingWorkDays % 5 == 0)
daysToAdd -= 2;
}
}
startDate.setDate(startDate.getDate() + daysToAdd);
return startDate;
}
//And use it like so (months are zero based)
var today = new Date(2016, 10, 22);
today = addWorkDays(today, 5); // Tue Nov 29 2016 00:00:00 GMT+0000 (GMT Standard Time)
还可以将其添加到日期原型中-
Date.prototype.addWorkDays = function (days) {
if(isNaN(days)) {
console.log("Value provided for \"days\" was not a number");
return
}
// Get the day of the week as a number (0 = Sunday, 1 = Monday, .... 6 = Saturday)
var dow = this.getDay();
var daysToAdd = parseInt(days);
// If the current day is Sunday add one day
if (dow == 0) {
daysToAdd++;
}
// If the start date plus the additional days falls on or after the closest Saturday calculate weekends
if (dow + daysToAdd >= 6) {
//Subtract days in current working week from work days
var remainingWorkDays = daysToAdd - (5 - dow);
//Add current working week's weekend
daysToAdd += 2;
if (remainingWorkDays > 5) {
//Add two days for each working week by calculating how many weeks are included
daysToAdd += 2 * Math.floor(remainingWorkDays / 5);
//Exclude final weekend if the remainingWorkDays resolves to an exact number of weeks
if (remainingWorkDays % 5 == 0)
daysToAdd -= 2;
}
}
this.setDate(this.getDate() + daysToAdd);
};
//And use it like so (months are zero based)
var today = new Date(2016, 10, 22)
today.addWorkDays(5); // Tue Nov 29 2016 00:00:00 GMT+0000 (GMT Standard Time)
我想你可以用
例如:
// 22-11-2016 is Tuesday, DD-MM-YYYY is the format
moment('22-11-2016', 'DD-MM-YYYY').businessAdd(5)._d // Tue Nov 29 2016 00:00:00 GMT-0600 (CST)
const date=新日期('2000-02-02')
const daysToAdd=mapToWorkdays(日期,37)
date.setUTCDate(date.getUTCDate()+daysToAdd)
console.log(date.toISOString().split('T')[0])
//打印2000-03-24
/**
*@param{Date}Date开始日期
*@param{number}添加要添加的工作日数
*@return{number}要添加以达到正确日期的总天数
*/
函数映射到工作日(日期,添加){
const wd=工作日(日期)
设r=Math.trunc(加法/5)*2
常量rem=添加%5
如果(wd>4)r+=(6-wd)
否则,如果(wd+rem>4)r+=2
返回add+r
}
/**
*@param{Date}Date
*@return{number}在0..6范围内的一周中的第几天(星期一..星期日)
*/
函数weekday(date){return(date.getUTCDay()+6)%7}
更新了上面的脚本,以便在给定负天数时也减去工作日
function addWorkDays(startDate, days) {
var isAddingDays = (days > 0);
var isDaysToAddMoreThanWeek = (days > 5 || days < -5);
if (isNaN(days)) {
console.log("Value provided for \"days\" was not a number");
return
}
if (!(startDate instanceof Date)) {
console.log("Value provided for \"startDate\" was not a Date object");
return
}
var dow = startDate.getDay();
var daysToAdd = parseInt(days);
if ((dow === 0 && isAddingDays) || (dow === 6 && !isAddingDays)) {
daysToAdd = daysToAdd + (1 * (isAddingDays ? 1 : -1));
} else if ((dow === 6 && isAddingDays) || (dow === 0 && !isAddingDays)) {
daysToAdd = daysToAdd + (2 * (isAddingDays ? 1 : -1));
}
if (isDaysToAddMoreThanWeek) {
daysToAdd = daysToAdd + (2 * (Math.floor(days / 5)));
if (days % 5 != 0)
daysToAdd = daysToAdd + (2 * (isAddingDays ? -1 : 1));
}
startDate.setDate(startDate.getDate() + daysToAdd);
var newDate = moment(startDate).format('MM/DD/YYYY');
return newDate;
}
函数添加工作日(开始日期,天){
var isAddingDays=(天>0);
var为每周增加的天数=(天数>5天| |天<-5天);
如果(isNaN(天)){
log(“为\“天\”提供的值不是一个数字”);
返回
}
如果(!(开始日期-开始日期-结束日期)){
log(“为\“startDate\”提供的值不是日期对象”);
返回
}
var dow=startDate.getDay();
var daysToAdd=parseInt(天);
如果((道琼斯指数===0&&isAddingDays)| |(道琼斯指数===6&&isAddingDays)){
daysToAdd=daysToAdd+(1*(isAddingDays?1:-1));
}否则如果((道琼斯指数===6&&isAddingDays)| |(道琼斯指数===0&&isAddingDays)){
daysToAdd=daysToAdd+(2*(isAddingDays?1:-1));
}
如果(IsDaysToAdds超过一周){
daysToAdd=daysToAdd+(2*(数学下限(天/5));
如果(天数%5!=0)
daysToAdd=daysToAdd+(2*(isAddingDays-1:1));
}
startDate.setDate(startDate.getDate()+daysToAdd);
var newDate=时刻(startDate)。格式('MM/DD/YYYY');
返回newDate;
}
如果是几天,而不是几千天,那么这更容易理解:
let currentDate = new Date();
for (let i =1; i<=p.days;i++)
{
currentDate.setDate(currentDate.getDate() + 1 );
if (currentDate.getDay() == 6)
{
currentDate.setDate(currentDate.getDate() + 2 );
}
else if (currentDate.getDay() == 0)
{
currentDate.setDate(currentDate.getDate() + 1 );
}
}
让currentDate=新日期();
对于(让i=1;对于原型,我使用返回此.addDays(daysToAdd),而不是this.setDate(this.getDate()+daysToAdd);
;
因为它更像本机Date.prototype.addDays
的工作方式。@CSquared nativeDate.prototype.addDays
?我不知道本机addDays
方法,并且它没有在MDN-上记录;您确定它没有被另一个JS文件添加到您的解决方案中吗?我已经纠正了,它不是本机的ve。在我的例子中,它来自剑道UI库。我希望它是本机的。我认为此解决方案不正确。对于星期六和星期日,当add参数是5的倍数时,mapToWorkdays的结果不正确。我已与Excel返回的结果进行了比较,确认这些特定结果是错误的。我已替换用if(wd>4)r+=(6-wd)乘以if(wd>4){r+=(6-wd)if(rem==0)r-=2}来纠正这个问题。在这里查看早期的解决方案甚至更错误,但我没有花时间来修复它们。从星期二开始加上5天(它返回下一个星期天)不起作用。