2017-03-01 89 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