计算不包括晚上和周末的日期之间的分钟数?

时间:2017-02-17 17:44:26

标签: javascript node.js datetime

我正在尝试计算两个日期之间的营业时间。营业时间定义为美国东部时间上午8点至下午6点(如果夏令时则为美国东部时间)。

我找到了这个答案,它会在几个小时内完成,但我不确定如何转换为分钟,并确保我的时区不会搞砸:

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是我想出来的课程,必须有更好的方法(这是我第一次钻研nodejs)

&#13;
&#13;
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;
&#13;
&#13;
&#13;