2014-02-24 74 views
2

我有兩個日期選擇器,從中我可以計算一天的數量而不用計算週六和週日。但我想在週五和週六做這個。我嘗試了一些不同的方法,但失敗了。這是容易的,我處理天不包括星期六和星期天,但不是爲週五和週六下面的號碼是我的javascript代碼 -使用JavaScript和jQuery UI獲取工作日數日期選擇器

$(function() { 
    $("#startDate").datepicker({ 
     onSelect: calculateDays}); 
    }); 

    $(function() { 
     $("#endDate").datepicker({ 
      onSelect: calculateDays}); 
     }); 

     function calculateDays(startDate, endDate) { 
      var form = this.form 

      var startDate = document.getElementById("startDate").value; 
      var startDate = new Date(startDate); 

      var endDate = document.getElementById("endDate").value; 
      var endDate = new Date(endDate); 

      startDate.setHours(0,0,0,1); // Start just after midnight 
      endDate.setHours(23,59,59,999); // End just before midnight 

      var oneDay = 24*60*60*1000; 
      var diff = endDate - startDate; // Milliseconds between datetime objects 
      var days = Math.ceil(diff/oneDay); 

      var weeks = Math.floor(days/7); 
      var 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 

      if (days) 
       document.getElementById("result").innerHTML=days; 
     } 

而我的HTML是:

<form id="dateDifference" style="width:200px;"> 
    <input name="startDate" id="startDate" value="" > 
    <input name="endDate" id="endDate" value="" > 
</form> 
<span id="result"></span> 

回答

3
// Count days from d0 to d1 inclusive, excluding Fridays and Saturdays 
function calculateDays(d0, d1) 
{ 
    var ndays = 1 + Math.round((d1.getTime()-d0.getTime())/(24*3600*1000)); 
    var nsaturdays = Math.floor((ndays + d0.getDay())/7); 
    return ndays - 2*nsaturdays + (d0.getDay()==6) - (d1.getDay()==5); 
} 

其中d0d1是開始和結束Date對象(與天值的相同小時)。

+0

此代碼似乎對我有問題...取決於結束日期。 –

+0

@MikeQ示例? – Matt

+0

函數calculateBizDays(sDate,eDate) {varily saturday = 7; var sunday = 1; sDate.setHours(23); //這應該是0,但服務器是按小時關閉的。 sDate.setMinutes(0); sDate.getSeconds(0); eDate.setHours(0); // BPM是HOUR OFF?爲什麼? eDate.setMinutes(59); eDate.getSeconds(59); (((eDate.getTime()* 1000)-sDate.getTime())/(24 * 3600 * 1000)); var nsaturdays = Math.floor((ndays + sDate.getDay())/ 7); return ndays - 2 * nsaturdays - (sDate.getDay()== sunday) - (eDate.getDay()== saturday); } –

0

javascript日期的方法,getDay ()將在星期日返回0,星期一返回1等。

您應該能夠使用日期對象並檢查一週中的當前日期,並將它們排除在5(星期五)和6(星期六)。

http://www.w3schools.com/jsref/jsref_getday.asp

+0

我知道。但我已經提到,計算沒有周六和週日的日子很容易,因爲週六的價值最高(6),而其他的則是最低的。因此,每次計算星期六開始的差異時,您將得到一個大於1的值,並且當日差小於一週(7天)時,您可以輕鬆減去2天。但是,如果我從星期五開始計算,日期值爲5,那麼很難做到。對不起英語不好。 –

2

另一種方法。

for(var i = startDate ; i <= endDate ;i.setDate(i.getDate() + 1)){ 
      if(i.getDay() != 6 && i.getDay() != 0) 
      { 
       days = days + 1; 
       } 
      } 

如果要計算在這一年的工作日數它會給你的節數天,除了週六和週日

+0

這種方法可以幫助,如果你想排除計算,如國家或銀行假期的具體日子。 IF語句可以包括檢查您自己構建的假期陣列中的日期。 –

0

const monthWorkDays = (year, month) => 
new Array(32 - new Date(year, month, 32).getDate()) 
    .fill(1) 
    .filter(
     (id, index) => 
      [0, 6].indexOf(
       new Date(year, month, index + 1).getDay()) === -1 
      ).length; 

const yearWorkDays = (year) => 
new Array(12) 
    .fill(1) 
    .reduce((pv, cv, index) => pv + monthWorkDays(year, index), 0); 

yearWorkDays(2017)