2016-05-06 20 views
0

2つの日付の間の稼働日を計算しているjavascript関数がありますが、問題は休暇とはみなされません。例外の配列に休日を追加するなど、この関数を変更するにはどうすればよいですか?Javascriptの2つの日付の間の休日を計算する休日を除いて

この質問はインターネットで検索されましたが、休日の例外については見つかりませんでした。

例の休日アレイの場合

var holidays = ['2016-05-03','2016-05-05']; 

そして、私はこれを計算する機能を持っている:たぶんそこ

JSFiddle example

:持っているが、jsfiddleの例を作っ

function workingDaysBetweenDates(d0, d1) { 
    var startDate = parseDate(d0); 
    var endDate = parseDate(d1); 
    // Validate input 
    if (endDate < startDate) 
     return 0; 

    // Calculate days between dates 
    var millisecondsPerDay = 86400 * 1000; // Day in milliseconds 
    startDate.setHours(0,0,0,1); // Start just after midnight 
    endDate.setHours(23,59,59,999); // End just before midnight 
    var diff = endDate - startDate; // Milliseconds between datetime objects  
    var days = Math.ceil(diff/millisecondsPerDay); 

    // Subtract two weekend days for every week in between 
    var weeks = Math.floor(days/7); 
    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 

    return days; 
} 
function parseDate(input) { 
    // Transform date from text to date 
    var parts = input.match(/(\d+)/g); 
    // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]]) 
    return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based 
} 

Jqueryで簡単に使用できる他の関数です?

+0

投稿する前に検索してください。これは尋ねられ、繰り返し答えられました。 –

+0

*「これを計算する関数があります」*質問に関連している場合は、リンクされているだけでなく質問に入れます。もしそうでなければ、おそらく言及する価値はないでしょう。 –

+0

説明に追加された機能 – AlexIL

答えて

2

これを達成する最も簡単な方法は、開始日と終了日の間のこれらの日を検索することです。

$(document).ready(function(){ 
 
\t $('#calc').click(function(){ 
 
    var d1 = $('#d1').val(); 
 
    var d2 = $('#d2').val(); 
 
\t \t $('#dif').text(workingDaysBetweenDates(d1,d2)); 
 
\t }); 
 
}); 
 

 
function workingDaysBetweenDates(d0, d1) { 
 
\t var holidays = ['2016-05-03','2016-05-05']; 
 
    var startDate = parseDate(d0); 
 
    var endDate = parseDate(d1); 
 
    // Validate input 
 
    if (endDate < startDate) { 
 
     return 0; 
 
    } 
 
    // Calculate days between dates 
 
    var millisecondsPerDay = 86400 * 1000; // Day in milliseconds 
 
    startDate.setHours(0,0,0,1); // Start just after midnight 
 
    endDate.setHours(23,59,59,999); // End just before midnight 
 
    var diff = endDate - startDate; // Milliseconds between datetime objects  
 
    var days = Math.ceil(diff/millisecondsPerDay); 
 
    
 
    // Subtract two weekend days for every week in between 
 
    var weeks = Math.floor(days/7); 
 
    days -= weeks * 2; 
 

 
    // Handle special cases 
 
    var startDay = startDate.getDay(); 
 
    var endDay = endDate.getDay(); 
 
    
 
    // Remove weekend not previously removed. 
 
    if (startDay - endDay > 1) { 
 
     days -= 2; 
 
    } 
 
    // Remove start day if span starts on Sunday but ends before Saturday 
 
    if (startDay == 0 && endDay != 6) { 
 
     days--; 
 
    } 
 
    // Remove end day if span ends on Saturday but starts after Sunday 
 
    if (endDay == 6 && startDay != 0) { 
 
     days--; 
 
    } 
 
    /* Here is the code */ 
 
    for (var i in holidays) { 
 
     if ((holidays[i] >= d0) && (holidays[i] <= d1)) { 
 
     \t days--; 
 
     } 
 
    } 
 
    return days; 
 
} 
 
      
 
function parseDate(input) { 
 
\t // Transform date from text to date 
 
    var parts = input.match(/(\d+)/g); 
 
    // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]]) 
 
    return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="d1" value="2016-05-02"><br> 
 
<input type="text" id="d2" value="2016-05-08"> 
 

 
<p>Working days count: <span id="dif"></span></p> 
 
<button id="calc">Calc</button> 
 

 
<p> 
 
Now it shows 5 days, but I need for example add holidays 
 
3 and 5 May (2016-05-03 and 2016-05-05) so the result will be 3 working days 
 
</p>

+1

申し訳ありませんが、関数のパラメータを再利用しようとしましたが、できませんでしたので、 '$( '#d1').val()'を 'parseDate(d0)'の代わりに使用しました。 – OscarGarcia

+0

ありがとうございます!私はあなたの答えに変更を加えました。今すぐすべての作品は正しいです:) – AlexIL

+0

あなたは歓迎です、私は 'days - 'の代わりに 'days = days-1'を使って改良しました。なぜ私は同じコードを私に "5日"を示した変更を行ったのか分からない:)編集:ああ! parseDateは文字列ではなくDateを返します。 :D – OscarGarcia

0

単にあなたが(あなたのフィドルに)持っている値から配列の長さを短く

var numberofdayswithoutHolidays= 5; 
var holidays = ['2016-05-03','2016-05-05']; 
alert(numberofdayswithoutHolidays - holidays.length); 
あなたは休日の週末をフィルタリングする必要が

同様

holidays = holidays.filter(function(day){ 
    var day = parseDate(day).getDay(); 
    return day > 0 && day < 6; 
}) 
+0

正しいロジックではありません。例えば、私は休日の配列を持ちます: 'var holidays = ['2016-05-03'、 '2016-05-05'、 '2016-12-31'];そして、 3 – AlexIL

+0

@AlexILあなたが休日に週末を含む場合はtrueです。しかし、別のループを実行して、この 'holidays'配列から週末を除外することができます。 – gurvinder372

+0

@AlexILは、(あなたがすでに持っている)カウントから減算する前に、休日を除外するロジックをチェックします。 – gurvinder372

0

試してみてください。

var startDate = new Date('05/03/2016'); 
var endDate = new Date('05/10/2016'); 
var numOfDates = getBusinessDatesCount(startDate,endDate); 

function getBusinessDatesCount(startDate, endDate) { 
    var count = 0; 
    var curDate = startDate; 
    while (curDate <= endDate) { 
     var dayOfWeek = curDate.getDay(); 
     if(!((dayOfWeek == 6) || (dayOfWeek == 0))) 
      count++; 
     curDate.setDate(curDate.getDate() + 1); 
    } 
    alert(count) 
    return count; 
} 
+0

しかし、休日のカウントをどのように統合できますか? – AlexIL

関連する問題