我有以下内容可以满足我的需求:
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 :(得分:0)
我在jsfiddle工作的这个功能应该做你想要的。你需要通过它的步伐来运行它,以确保它正确地计算所有内容。
function 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);
}
答案 1 :(得分: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/
<强>更新强>
如果您确实需要将时间表示为负数,只需在calcWorkHours
中切换参数:
return calcWorkHours(end, start);