2013-06-13 20 views
7

から土日を除外:ここは、私は私のニーズのために正常に動作し、次のを持っている日付/時刻の時間数

function funLoad(str1,str3,str4) 
{ 

    var dym1 = str1.split("/"); 

    var d=new Date(); 
    var dym2 = d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes() + ":00"; 
    //var dym2 = "6 10 2013 09:00:00"; 

    var start = Date.parse(dym1[1] + "-" + dym1[0] + "-" + dym1[2] + " " + str3 + ":" + str4 + ":00"); 
    var end = Date.parse(dym2); 

    return (start-end)/(1000*60*60); 

} 

$("#btn1").click(function(event){ 
    alert(funLoad($("#txt1").val(),$("#ddlHourTime").val(),$("#ddlMinuteTime").val())); 
}); 

はjsfiddleです: http://jsfiddle.net/QTVWd/8/

私はIE8でこの意志おそらく唯一の仕事ことを理解します私は誰もがIE8しか使用しないイントラネット環境で開発しているので、それは問題ではありません。それを無視して、このスクリプトは選択された日付と時刻を取得し、現在の日付/時刻と比較して時間を返します。これまでのすべての良い。

問題は週末をカウントすることです。週末のみが含まれている場合は、平日の時間をカウントして週末を除外するにはどうすればよいですか?たとえば、開始日が金曜日で、終了日が月曜日の場合、週末の48時間を除いて、金曜日と金曜日の時間のみをカウントする必要があります。

+0

夏時間を想定し、ない毎日24時間の長さであることに注意してください。 (ここでは週末の日を特に話しているので、問題のある土曜日の土曜日は2つあります)。私が一目瞭然で見る限り、これまでの答えのどれも説明していません。 – CBroe

答えて

0

私がjsfiddleで仕上げたこの機能は、あなたの探していることをすべきです。すべてのものが正しく計算されていることを確認するために、ペースで実行したいと思うでしょう。

updated jsfiddle

関数funLoad(STR1、STR3、STR4){

var dym1 = str1.split("/"); 

// get the given(start) epoch value (using midnight for time - will adjust for actual time further below) 
var start_date = new Date(dym1[2], (dym1[1]-1), dym1[0], 0, 0, 0, 0);  
var start_epoch = start_date.getTime(); 

// get todays(end) epoch value (using midnight for time - will adjust for actual time further below)  
var end_d = new Date(); 
var end_epoch = new Date(end_d.getFullYear(), end_d.getMonth(), end_d.getDate(), 0, 0, 0, 0).getTime(); 
var end_date_is_weekend = (end_d.getDay()==0 || end_d.getDay()==6)?1:0;  

// get value for 1 day in milliseconds 
var one_day = 1000*60*60*24; 

// how many days between given date and todays date 
var total_days = Math.ceil((end_epoch - start_epoch)/one_day)-1; 

// figure out how many of those total days are weekend days 
var date_to_check = start_epoch + one_day; 
var total_weekend_days = 0; 
var next_day_is_weekend = 0; 
for(var x=0; x<total_days; x++){ 
    d=new Date(date_to_check); 
    if(d.getDay()==0 || d.getDay()==6){ 
     total_weekend_days++; 
     if(x==0){next_day_is_weekend=1;} 
    } 
    date_to_check += one_day 
} 

// determine number of week days 
var total_week_days = total_days - total_weekend_days; 

// get the total hours from the total week days 
var total_hours = total_week_days*24; 

// still need to add the remaining hours from the given(start) date and the number of hours that have already past in the end(todays) date 

// add in the remaining hours left in the start date 
var hours_remaining_in_start_date = 0; 

// rounding up to next nearest start date hour 
if(str4 > 30){ 
    if(str3 == 23 && next_day_is_weekend==0){ 
     // rounding up puts the start date into the start of the next day so subtract 
     // one day from the total, UNLESS the next day is a weekend. 
     total_week_days -= 1; 

     hours_remaining_in_start_date = -24; 

    }else{ 
     hours_remaining_in_start_date = 24 - (str3+1);      
    } 
}else{ 
    hours_remaining_in_start_date = 24 - str3;   
}  

total_hours += hours_remaining_in_start_date; 

    // add in the hours from the end date (today date), UNLESS today is a weekend 
var hours_past_in_end_date = 0; 
var end_hour = end_d.getHours(); 
if(end_date_is_weekend==0){ 
    // rounding up to next nearest end date hour 
    if(end_d.getMinutes() > 30){ 
     if(end_hour == 23){ 
      // rounding up makes it a full day 
      hours_past_in_end_date = 24; 
     }else{ 
      // rounding up just adds an hour 
      hours_past_in_end_date = end_hour+1; 
     } 
    }else{ 
     hours_past_in_end_date = end_hour;  
    } 
} 
total_hours += hours_past_in_end_date; 



$('#result').html('start epoch:'+start_epoch+', end epoch:'+end_epoch+', total days'+total_days+', total weekends'+total_weekend_days+', total week days:'+total_week_days+', hours_remaining_in_start_date:'+hours_remaining_in_start_date+', hours_past_in_end_date:'+hours_past_in_end_date+', total hours:'+total_hours); 

}

+0

最初のjsfiddleリンクは何かひどいところに行きました。正しい場所を指すように更新しました。申し訳ありません。 – Drew

0

これは動作します:

var calcWorkHours = function calcWorkHours(start, end) { 
     var total = (end - start)/(1000 * 60 * 60 * 24), // compute difference in days 
      totalDays = parseInt(total, 10),    // trim fractional portion 
      remainder = (total - totalDays) * 24,   // save fractional portion in hours 
      startingDay = start.getDay(),     // starting weekday 
      endingDay = end.getDay(),      // ending weekday 
      possibleWorkingDays = (totalDays * 5), 
      actualOccurringWeekends = (startingDay - endingDay) * 2, 
      workDays = (possibleWorkingDays - actualOccurringWeekends)/7; 
     if (endingDay === 6) { 
      workDays -= 1; // ends on a weekend, subtract a day 
     } 
     if (startingDay === 0) { 
      workDays -= 1; // starts on a weekend, subtract a day 
     } 
     return (workDays * 24) + remainder; // convert to hours and add back fractional portion 
    }, 
    parseInputs = function parseInputs(date, hour, minute) { 
     var dmy = date.split("/"), 
      now = new Date(), 
      thisMinute = now.getMonth() + 1 + "-" + now.getDate() + "-" + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":00", 
      start = Date.parse(dmy[1] + "-" + dmy[0] + "-" + dmy[2] + " " + hour + ":" + minute + ":00"), 
      end = Date.parse(thisMinute); 
     start = new Date(start); 
     end = new Date(end); 
     return calcWorkHours(start, end); 
    }; 

は、ここでのアクションでそれを見るhttp://jsfiddle.net/QTVWd/9/

UPDATE

あなたは本当にただcalcWorkHoursでパラメータを切り替えて、負の数で表される時間が必要な場合:

return calcWorkHours(end, start); 
関連する問題