2017-02-17 84 views
0

我試圖計算兩個日期之間的業務時間,下至分鐘。營業時間定義爲東部時間上午8點到下午6點(如果是夏令時,則爲EDT)。計算不包括晚上和週末的日期之間的分鐘數?

我找到這個答案,這在小時進行這一點,但我不知道該如何轉換爲分鐘,並確保我的時區不會被搞砸了:

https://stackoverflow.com/a/11092865/104998

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

任何幫助將不勝感激。

+0

要轉換到分鐘乘小時由60 –

+0

感謝您的提示喬治:) –

回答

0

這裏是我想出了這樣做的類,必須有一個更好的方法(這是我第一次在深入研究的NodeJS)

var dateFuncs = DateFuncs.prototype; 
 

 
function DateFuncs() { 
 

 
} 
 

 

 
DateFuncs.prototype.isWeekend = function(pDate) { 
 
    return (pDate.getDay() == 0 || pDate.getDay() == 6); 
 
} 
 

 
DateFuncs.prototype.isBusinessMinute = function(pDate) { 
 
    var hours = pDate.getHours() + pDate.getMinutes()/60; 
 
    return (hours >= 8 && hours < 18); //business hours are 8AM-6PM 
 
} 
 

 
DateFuncs.prototype.addMinutes = function(date, minutes) { 
 
    return new Date(date.getTime() + minutes*60000); 
 
} 
 

 
DateFuncs.prototype.diffBusinessMins = function(/*Date*/ startDate, /*Date*/ endDate) { 
 
    var minutesDiff = 0; 
 
    startDate.setSeconds(0,0); 
 
    endDate.setSeconds(0,0); 
 

 
    var curDate = new Date(startDate.getTime()); 
 

 
    while(curDate.getTime() != endDate.getTime()) 
 
    { 
 
    if(!this.isWeekend(curDate) && this.isBusinessMinute(curDate)) 
 
    { 
 
     minutesDiff += 1; 
 
    } 
 

 
    curDate = this.addMinutes(curDate, 1); 
 
    } 
 

 
    return minutesDiff; 
 
} 
 

 

 

 
module.exports = DateFuncs;

相關問題