2013-06-13 18 views
7

Mam następujący która działa dobrze dla moich potrzeb:Wykluczanie weekendy od daty/czasu zliczania godzinnym

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())); 
}); 

Oto jsfiddle: http://jsfiddle.net/QTVWd/8/

Doceniam, że będzie to prawdopodobnie tylko praca w IE8 , ale rozwijam się w środowisku intranetowym, gdzie wszyscy używają tylko IE8, więc to nie jest problem. Ignorując to, ten skrypt pobiera wybraną datę i czas, porównuje go z bieżącą datą/czasem i zwraca godziny. Jak dotąd wszystko dobrze.

Problem polega na tym, że liczy się w weekendy. Jak liczyć godziny tylko w dni powszednie i wykluczać weekendy, jeśli data rozpoczęcia i zakończenia obejmuje weekendy? Na przykład, jeśli data rozpoczęcia przypada w piątek, a data zakończenia przypada w poniedziałek, powinna ona obejmować tylko godziny w piątek i poniedziałek, z wyłączeniem 48 godzin w weekendy.

+0

Należy pamiętać, że nie każdy dzień ma 24 godziny długo, zakładając, że światło dzienne czas oszczędzania obowiązuje w używanej strefie czasowej (ponieważ mówimy tutaj konkretnie o dniach weekendu tutaj, są dwa soboty w roku, które są problematyczne). Z tego, co widzę z szybkiego spojrzenia, żadna z dotychczasowych odpowiedzi tego nie wyjaśnia. – CBroe

Odpowiedz

0

Ta funkcja, którą opracowałem w jsfiddle, powinna zrobić to, czego szukasz. Będziesz chciał go uruchomić w swoim tempie, aby upewnić się, że wszystko jest obliczane poprawnie.

updated jsfiddle

funkcja 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

Pierwszy link jsfiddle przeszedł do czegoś okropnego. Po prostu zaktualizowałem, aby wskazać właściwe miejsce. Przepraszam za to. – Drew

0

to będzie działać:

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); 
    }; 

Zobacz go w akcji tutaj: http://jsfiddle.net/QTVWd/9/

UPDATE

Jeśli naprawdę potrzebujesz godzin wyrażone jako liczbę ujemną, wystarczy przełączyć parametry w calcWorkHours:

return calcWorkHours(end, start); 
Powiązane problemy