创建具有休息时间段的时间段

时间:2021-07-06 17:08:56

标签: javascript

我正在开发一个日历,该日历可按带休息时间的时间段设置可用性。

我有两个输入数据

  1. 基本开始和结束时间。示例:

    [{startTime: '07:00', endTime '21:00'}]
    
  2. 休息时间。示例:

    [{startTime: '08:00', endTime:'08:30'},
     {startTime: '10:00', endTime:'10:30'},
     {startTime: '12:00', endTime:'13:00'},
     {startTime: '15:00', endTime:'15:30'},
     {startTime: '18:00', endTime:'19:00'}]
    

我需要根据基本开始和结束时间以及休息时间细分时间段。

给出上面输入数据的例子,我想得到。

   [{startTime: '07:00', endTime: '07:59'}, 
    {startTime: '08:31', endTime: '09:59'},
    {startTime: '10:31', endTime: '11:59'},
    {startTime: '13:01', endTime: '14:59'},
    {startTime: '15:31', endTime: '17:59'},
    {startTime: '19:01', endTime: '21:00'}]

1 个答案:

答案 0 :(得分:1)

reduce 函数有助于管理数据转换。我使用了一个单独的函数来加/减时间

function getTimeFrom(time, diff) {
  time = time.split(":");
  let h = +time[0], m = +time[1]
  if (time[1] == "00" && diff < 0) {
    m = 60 + diff;
    h -= 1;
  } else m += diff;
  return ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2)
}

let worktime = [{startTime: '07:00', endTime: '21:00' }], breaktime = [{startTime: '08:00', endTime:'08:30'},
 {startTime: '10:00', endTime:'10:30'},
 {startTime: '12:00', endTime:'13:00'},
 {startTime: '15:00', endTime:'15:30'},
 {startTime: '18:00', endTime:'19:00'}]

let workdetail = breaktime.reduce((b, a, i) => {
  if (i === 0) b[0].finalEndTime = b[0].endTime // save the value
  b[i].endTime = getTimeFrom(a.startTime, -1)
  a.startTime = getTimeFrom(a.endTime, 1)
  if (i === breaktime.length - 1) {
    a.endTime = b[0].finalEndTime; // our final end time for the day
    delete b[0].finalEndTime // remove it
  }
  b.push(a);
  return b;
}, worktime)

console.log(workdetail)