2017-03-01 112 views
0

我需要做3个连续工作日对证在javascript日期数组。我把它与任何3个天工作,但我无法弄清楚了我的生活,我怎么能做出与周末打破了连续两天这项工作。连续工作日(没有周末)

注意 - 这需要时刻()库(https://momentjs.com

我的代码,对于3实际连续几天的工作原理:

var allDates = ["2017-03-07", "2017-03-09", "2017-03-10", "2017-03-13", "2017-03-15"]; 
var diff = 86400000; 
var consecutive = 0; 

allDates.sort(function(a,b){ 
    return new Date(a) - new Date(b); 
}); 

for (i = 2; i < allDates.length; i++) { 
    var d = moment(allDates[i], "YYYY-MM-DD").format('x'); 
    var d1 = moment(allDates[i-1], "YYYY-MM-DD").format('x'); 
    var d2 = moment(allDates[i-2], "YYYY-MM-DD").format('x'); 

    if (d1 - d2 == diff && d - d2 == diff * 2) { 
    consecutive = 1;    
    break; 
    } 
} 

enter image description here

正如你可以看到上面的日历,我希望3月9日,10日和13日连续3个工作日。任何人有任何反馈可以引导我走上正确的道路?

在此先感谢

+0

只是为了澄清 - 你的阵列有5个日期。如果*阵列中的任何*三个日期都是连续工作日,您是否想要返回true? – Jamiec

+0

是连续3个工作日。 – rubberchicken

+0

公共假期怎么样? – Jamiec

回答

0

这似乎是从我的所有测试工作迄今...除非有人能指出问题或错误。

注意 - 这需要时刻()库(https://momentjs.com

var allDates = ["2017-03-07", "2017-03-09", "2017-03-10", "2017-03-13", "2017-03-15"]; 
 
var consecutive = 0; 
 

 
allDates.sort(function(a,b){ 
 
    return new Date(a) - new Date(b); 
 
}); 
 

 
for (i = 2; i < allDates.length; i++) { 
 
    var d = moment(allDates[i], "YYYY-MM-DD"); 
 
    var d1 = moment(allDates[i-1], "YYYY-MM-DD"); 
 
    var d2 = moment(allDates[i-2], "YYYY-MM-DD"); 
 
\t \t \t \t \t 
 
    if (d1.diff(d2,"days") == 1 && d.diff(d2,"days") == 2 || 
 
     d2.weekday() == 5 && d1.weekday() == 1 && d1.diff(d2,"days") == 3 && d.diff(d1,"days") == 1 || 
 
     d1.weekday() == 5 && d.weekday() == 1 && d.diff(d1,"days") == 3 && d1.diff(d2,"days") == 1) { 
 

 
    consecutive = 1;    
 
    break; 
 
    } 
 
} 
 
     
 
console.log('dates are consecutive: ' + consecutive)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.js"></script>

1

您可以使用JavaScript Date对象找出哪些天是周末。 这里是documentation

而且一个简单的例子:

var d1 = new Date("2017-03-07"); 
    var d2 = new Date("2017-03-08"); 
    d.getDay() // this will return 1, which corresponds with Monday. 2 is Tuesday, 3 is Wednesday, etc. 

那么一个小功能来告诉我们,如果2个日期是连续的,即使一个周末分开,可能是:

 var millisecondsInDay = 86400000; 

    function datesAreConsecutiveBusinessDays(date1, date2){ 
     // If date1 is a Friday and date2 is a Monday 
     if (date1.getDay() === 5 && date2.getDay() === 1){ 
     // And the dates are 2 days apart 
     date2.valeOf() - date1.valueOf() === millisecondsInDay * 2 
     return true; 
     } else if (date2.valeOf() - date1.valueOf() === millisecondsInDay){ 
     return true; 
     } else { 
     return false; 
     } 
    } 

所以用这个方法,你通过你的日期列表,并调用它每两个是旁边的海誓山盟。

 var consecutive = 0; 
    var allDates = ["2017-03-07", "2017-03-09", "2017-03-10", "2017-03-13", "2017-03-15"]; 

    for (var i = 0; i < allDates.length - 1; i++){ 
     if (datesAreConsecutiveBusinessDays(new Date(allDates[i]), new Date(allDates[i+1])){ 
     consecutive++; 
     } 
     // If you want to start over if you hit a nonconsecutive date, add this else: 
     else { 
     consecutive = 0; // this will start the counter over 
     } 
    } 

你可能需要调整解决方案有点取决于如何连续计算,但是这应该足以让你开始。

+0

感谢您的回复,但是如果周末日期不在日期列表中,这是如何起作用的? – rubberchicken

+0

您可以修改'dateStringIsWeekend()'函数来检查给定的日期是否是星期五,如果是,那么您知道如果之后的日期是星期一,则它们是连续的工作日。我会更新我的答案。 –

+0

好的,谢谢,如果你能把我的一些代码和你的代码结合起来,那真的会有帮助。 – rubberchicken

1

这可通过写其中确定是否有任何2个momentjs实例要么1天不同,或者如果一个是星期五,另一个是星期一(但必须只3天隔开)的函数来求解。简单地说,该做的:

function isConsecutive(a,b){ 
    return b.diff(a,"days") == 1 
     || (a.weekday() == 5 && b.weekday() == 1 && b.diff(a,"days") == 3); 
} 

然后你可以把你的日期阵列,他们都转向momentJS情况下,命令他们通过调用每对上述方法进行迭代。保持一个运行总计计数的:

function countConsecutiveDays(arr){ 
    var momentDates = arr.map(function(d){ 
     return moment(d, "YYYY-MM-DD") ; 
    }).sort(function(a,b){return a.diff(b);}) 
    var count = 0; 
    for(var i=1;i<momentDates.length;i++){ 
     if(isConsecutive(momentDates[i-1],momentDates[i])) 
      count++; 
    } 
    return count+1; 
} 

的工作例如低于

function countConsecutiveDays(arr){ 
 
    var momentDates = arr.map(function(d){ 
 
     return moment(d, "YYYY-MM-DD") ; 
 
    }).sort(function(a,b){return a.diff(b);}) 
 
    var count = 0; 
 
    for(var i=1;i<momentDates.length;i++){ 
 
     if(isConsecutive(momentDates[i-1],momentDates[i])) 
 
      count++; 
 
    } 
 
    return count+1; 
 
} 
 

 
function isConsecutive(a,b){ 
 
    return b.diff(a,"days") == 1 
 
     || (a.weekday() == 5 && b.weekday() == 1 && b.diff(a,"days") == 3); 
 
} 
 

 

 
console.log(countConsecutiveDays(["2017-03-07", "2017-03-09", "2017-03-10", "2017-03-13", "2017-03-15"]));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.js"></script>

+0

我发现这个问题...如果日期是[“2017-03-14”,“2017-03-15”,“2017-03-29 “,”2017-03-30“]只有2个是连续的,但它的连续3天... – rubberchicken

+0

@rubberchicken是的,它有2组连续2个日期,我的算法有一个错误。你能解决它还是想让我更新? – Jamiec

+0

你可以修复你的版本,我也会添加我自己的答案,这与我原来的帖子类似 – rubberchicken