【问题标题】:How to get times from a number of slots如何从多个插槽中获取时间
【发布时间】:2021-10-22 01:25:48
【问题描述】:

我正在尝试获取可用插槽的时间。我的数据库中有startDateTimeendDateTimedurationbufferBetweenSlots 字段。通过一些计算,我计算出了可用插槽的数量。

字段的值是:

startDateTime: 8/20/2021 11:30 AM
endDateTime: 8/20/2021 9:30 PM
duration: 60
bufferBetweenSlots: 30

但我不确定如何获取可用时段的开始和结束时间。例如10:00 - 11:00

const getTimeDiffInMins = (endTime, startTime) =>
  (+new Date(endTime) - +new Date(startTime)) / (60 * 1000);

const getMultipleTimeSlots = (data) => {
  const diff = getTimeDiffInMins(data.end_date_time, data.start_date_time);
  const totalSlots = diff / data.duration;
  const totalBuffer = data.buffer_between_slots * totalSlots;
  const availableSlots = (diff - totalBuffer) / 60;

  return availableSlots;
};

有什么建议吗?

【问题讨论】:

  • 您能否解释一下您遇到的具体问题是什么
  • 没有错误。所以在计算之后我得到了 5 个可用的时间段。我想知道如何获得这 5 个插槽的时间。就像每个插槽的时间是多少,例如10:00 - 11:00 只是时间戳或日期可以工作,然后我可以用 momentjs 格式化它
  • 你应该只需要插槽之间的缓冲区,所以缓冲区的数量是插槽数减1。你想解决n * slotTime + (n - 1) * buffer time == totalTime这样totalTime <= diff

标签: javascript date datetime calendar


【解决方案1】:

你应该只需要槽之间的缓冲区,所以缓冲区的数量比槽的数量少一,即你想解决:

n * slotTime + (n - 1) * bufferTime == totalTime

这样:

totalTime <= diff

您可以通过将缓冲区添加到 totalTime 并除以 slotTime + bufferTime 来实现,然后将结果铺平以获得可用插槽和缓冲区的总数。然后您可以迭代以产生所需的开始和结束时间。例如

let startDateTime = new Date(2021,7,8,11,30); // 20 Aug 2021 11:30
let endDateTime =  new Date(2021,7,8,22);  // 20 Aug 2021 22:00
let duration = 60; // minutes
let bufferBetweenSlots = 30; // minutes

let diff = (endDateTime - startDateTime) / 6e4; // minutes
let numberOfSlots = Math.floor((diff + bufferBetweenSlots) / (duration + bufferBetweenSlots)); // minutes

let slots = [];
let time = new Date(startDateTime);
for (let i = 0; i < numberOfSlots; i++) {
  // Add the slot start time
  slots[i] = {start: time.toString()};
  // Increment time to end of slot
  time.setMinutes(time.getMinutes() + duration);
  // Add the end time
  slots[i].end = time.toString();
  // Increment time to end of buffer
  time.setMinutes(time.getMinutes() + bufferBetweenSlots);
}

console.log(slots);

我将结束时间更改为 22:00,以表明它只放置在完整的插槽中。是否将时间戳或 Date 对象推入 slots 数组取决于您。请记住,如果添加日期,请复制日期,如:

slots[i] = {start: new Date(+time)};
...
slots[i].end = new Date(+time);

【讨论】:

    【解决方案2】:

    感谢@RobG 花时间回答。这就是我设法解决它的方法。

    const getTimeDiffInMins = (endTime, startTime) =>
      (+new Date(endTime) - +new Date(startTime)) / (60 * 1000);
    
    const convertToMilliSecs = (value) => value * 60 * 1000;
    
    // coming from the db
    const data = {
      duration: 60,
      buffer_between_slots: 30,
      start_date_time: '2021-08-20T10:30:00Z',
      end_date_time: '2021-08-20T20:30:00Z',
    };
    
    const {
      duration: a,
      buffer_between_slots: b,
      end_date_time: x,
      start_date_time: y,
    } = data;
    
    const duration = getTimeDiffInMins(x, y);
    const slotDuration = a;
    const totalSlots = a + b;
    
    const numberOfSlots = Math.floor(duration / totalSlots);
    
    const slotsAvailable = [...Array(numberOfSlots).keys()].map((slotNumber) => {
      const slotStart = (slotNumber - 1) * totalSlots;
      const slotEnd = slotStart + slotDuration;
    
      return {
        start: +new Date(y) + convertToMilliSecs(slotStart),
        end: +new Date(y) + convertToMilliSecs(slotEnd),
      };
    });
    
    /*
      Now we can format the time however we want
      I'm using momentjs:
      moment(new Date(slot.start)).format('h:mma')
    */
    console.log(slotsAvailable);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 2021-07-29
      • 2022-09-29
      • 2019-02-04
      • 2018-10-24
      • 2019-10-22
      • 1970-01-01
      相关资源
      最近更新 更多