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