Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算Javascript中的小时差,但仅计算特定的小时_Javascript_Date_Time - Fatal编程技术网

计算Javascript中的小时差,但仅计算特定的小时

计算Javascript中的小时差,但仅计算特定的小时,javascript,date,time,Javascript,Date,Time,不确定如何最好地描述这一点,但我需要计算小时数(四舍五入),但仅在晚上8点和早上6点之间(或者更确切地说,在这种情况下是20:00-06:00!) 例如: 22:00 - 04:00 (6 hours) 02:40 - 10:20 (4 hours) 20:00 - 06:00 (10 hours) 不幸的是,我需要确定确切的日期,因为有些日期会跨越多天-只是为了增加混乱,我还需要完全排除银行假日的某些日期(我有一个数组中的列表),但绝对不知道如何实施-欢迎任何建议,感谢您刚刚结束您的示例中输

不确定如何最好地描述这一点,但我需要计算小时数(四舍五入),但仅在晚上8点和早上6点之间(或者更确切地说,在这种情况下是20:00-06:00!)

例如:

22:00 - 04:00 (6 hours)
02:40 - 10:20 (4 hours)
20:00 - 06:00 (10 hours)

不幸的是,我需要确定确切的日期,因为有些日期会跨越多天-只是为了增加混乱,我还需要完全排除银行假日的某些日期(我有一个数组中的列表),但绝对不知道如何实施-欢迎任何建议,感谢您

刚刚结束您的示例中输入的内容:

// According to your example, your inputs are strings...
// t1 = "22:00"
// t2 = "04:00";

function hoursDiff(t1, t2){

   // Parse out the times, using radix 10 to
   // avoid octal edge cases ("08:00" & "09:00")
   var time1   = parseInt( t1, 10 );
   var time2   = parseInt( t2, 10 );
   var hours   = 0;

   while ( time1 !== time2 ){
      time1++;
      hours++;

      // If we've passed midnight, reset
      // to 01:00AM
      if ( time1 === 25 ){
         time1 = 1;
      }  
   }

   return hours;
}

好的,这是一个很好的拼图。这真的花了我太多时间,但很有趣

完整的工作代码如下():

函数isHoliday(/*Date*/Date){
对于(变量i=0;i如果(小时)我们可以看到您输入数据的样本吗?您使用的是完整的日期还是时间?为什么第三个示例中的差异(10小时)是第二个示例中的差异(2小时)。非常感谢,这看起来非常简单(很好!)与我提出的解决方案相比,我有一种感觉,它可能会起作用!我一回到工作岗位就会尝试实现它,非常感谢:)太糟糕了,这个答案不正确。请尝试
parseInt(“08:00”)
,它将返回
0
。当字符串以零开头时,
parseInt
默认将其解释为八进制数。这适用于00-07,但08和09无效。您需要使用
parseInt(t,10)
,但这仍然不能正确回答您的问题。@Bart:这一点您完全正确。我已经更新了帖子,以说明八进制边缘的情况。我应该一直这样做。很好的收获!非常感谢Bart,不幸的是,我已经根据上述ajax81的代码提出了类似的解决方案,所以我不确定是否需要希望我能把它分开,但既然你的答案正好符合我在这个案子中的需要,我会给他正确的答案,给你奖金,再次感谢你们两人提供了一个奇妙的解决方案!
function isHoliday(/*Date*/ date) {
    for(var i = 0; i < holidays.length; i++) {
        if(holidays[i].getTime() == date.getTime()) {
            return true;
        }
    }
    return false;
}

function diffHours(/*Date*/ d1, /*Date*/ d2) {
    var date1 = new Date(d1.getUTCFullYear()+"-"+(d1.getUTCMonth()+1)+"-"+d1.getUTCDate()+" UTC");
    var date2 = new Date(d2.getUTCFullYear()+"-"+(d2.getUTCMonth()+1)+"-"+d2.getUTCDate()+" UTC");

    var sum = 0;
    var oneday = 24*3600*1000;
    var hours, date;

    // first day
    if(!isHoliday(date1)) {
        // decrease by a whole day first (will be added later)
        sum -= 10;

        // add real hours
        hours = d1.getUTCHours() + d1.getUTCMinutes() / 60;
        if(hours <= 6) {
            sum += 10 - hours;
        } else if(hours <= 20) {
            sum += 4;
        } else {
            sum += 24 - hours;
        }
    }

    // last day
    if(!isHoliday(date2)) {
        // decrease by a whole day first (will be added later)
        sum -= 10;

        // add real hours
        hours = d2.getUTCHours() + d2.getUTCMinutes() / 60;
        if(hours <= 6) {
            sum += hours;
        } else if(hours <= 20) {
            sum += 6;
        } else {
            sum += hours - 14;
        }
    }

    // whole days
    while(date1 <= date2) {
        if(!isHoliday(date1)) {
            sum += 10;
        }

        // increase date by 1 day
        date1.setTime(date1.getTime() + oneday);
    }

    return Math.floor(sum);
}

// ==============
// examples below
// --------------

// array of Dates (in UTC) to skip
var holidays = [
    new Date("2012-01-04 UTC"),
];

for(var i = 0; i < holidays.length; i++) {
    console.log('holiday: ', holidays[i].toUTCString());
}

a = new Date("2012-01-01 12:00 UTC");
b = new Date("2012-01-02 12:00 UTC");
c = new Date("2012-01-02 22:00 UTC");
d = new Date("2012-01-03 07:00 UTC");
e = new Date("2012-01-05 12:00 UTC");

console.log({d1: a.toUTCString(), d2: b.toUTCString(), hours: diffHours(a, b)});
console.log({d1: b.toUTCString(), d2: c.toUTCString(), hours: diffHours(b, c)});
console.log({d1: c.toUTCString(), d2: d.toUTCString(), hours: diffHours(c, d)});
console.log({d1: d.toUTCString(), d2: e.toUTCString(), hours: diffHours(d, e)});