【问题标题】:How to format dates in Javascript date object and work with setting intervals between them?如何在 Javascript 日期对象中格式化日期并设置它们之间的间隔?
【发布时间】:2020-08-20 17:12:39
【问题描述】:

我正在制作一个调度应用程序。要求是用户输入两个时间范围,应用程序应将其划分为 20 个间隔,中间有 10 分钟的休息时间。例如,如果我输入 15:15-17:15,它应该给我如下插槽:['15:15', '15:35', '15:45', '16:55']。

我面临的错误:我使用的方法可以很好地设置间隔,但无法在其间设置 10 分钟的休息时间。我的输出给出 [“15:15”、“15:35”、“15:55”、“16:15”、“16:35”、“16:55”、“17:15”]。此外,如果我输入结束时间为 17:05,结果仍将最终计数为 17:15。

最后,如果上述两个问题得到解决,如果有人能告诉我如何格式化数组以使结果为:['15:15-15:35','15:45- 16:55']。 TIA

    let date1 = new Date(2020, 8, 20, 15, 15);
    let date2 = new Date(2020, 8, 20, 17, 05);
    let slots = []
    if(date1 < date2){
      console.log((date2.getHours()*60 - date1.getHours()*60)/20)
      for(var i = 0; date1 < date2; i=20)
      {
        date1.setMinutes(date1.getMinutes()+i)
        slots.push(date1.getHours() + ':' + date1.getMinutes());
      }
      console.log(slots)
    }
    else{
      console.log('End time should be greater than start time')
    }

【问题讨论】:

标签: javascript date object


【解决方案1】:

这应该可以解决问题:

const dateToString = date => date.getHours() + ':' + (date.getMinutes() + '').padStart(2, '0')

const date1 = new Date(2020, 8, 20, 15, 15);
const date2 = new Date(2020, 8, 20, 17, 05);

function getIntervals(date1, date2) {
    date1 = new Date(date1.getTime()) // so we don't mutate date1

    const intervalLength = 20, breakLength = 10, intervals = []
    let interval

    while (date1 < date2) {
        interval && intervals.push(interval)

        interval = [intervalLength, breakLength].map(len => {
            const str = dateToString(date1)
            date1.setMinutes(date1.getMinutes() + len)
            return str
        }).join('-') // - separator
    }

    return intervals
}

console.log(getIntervals(date1, date2))

dateToString 将 Date 对象转换为 hh:mm 格式,必要时用零填充分钟部分。为了获得间隔,我们通过交替时间长度的 intervalLength 和 breakLength 逐步完成,并将每个生成的间隔推送到我们的数组中。然后我们返回区间。

【讨论】:

  • 我不确定我应该如何做第一部分。我现在添加了有关答案如何工作的信息
  • 这很好用,只是为什么不考虑最后一个时间间隔,即 16:35-17:05?
  • 替换 date1
【解决方案2】:

OP 中的代码似乎没有正确划分时间或允许时段之间的间隔。

两个日期之间的时间需要分成 n 个时段,中间有 n-1 10 分钟的间隔。从另一个日期中减去一个日期将给出以毫秒为单位的时间差,然后需要将其划分为所需的时间段和间隔,例如

/**
 * @param {Date} start - start date and time
 * @param {Date} end - end date and time
 * @param {number} periods - number of periods
 * @param {number} interval - interval between periods in minutes
 * @returns {Array} array of perids with interval gap between
 *   in format ['HH:mm - HH:mm', ...]
 */
function getSlots(start, end, periods, interval) {
  // Function to format period timestamp
  function f(d) {
    return ('' + d.getHours()).padStart(2, '0') + ':' + ('' + d.getMinutes()).padStart(2, '0');
  }
  let slots = [];
  let diff = end - start;
  if (diff < 0) return 'End must be after start';
  // Get length of interval in ms
  let intLength = interval * 6e4;
  // Get total length of intervals in ms
  let intTotal = (periods - 1) * intLength;
  // Get length of each period in ms
  let periodLength = (diff - intTotal) / periods;
  
  // Generate periods
  for (let e, s = new Date(start), i = periods; i > 0; i--) {
    // Copy start to get end and add length of period
    e = new Date(+s + periodLength);
    // Write period to slots array
    slots.push(f(s) + '-' + f(e));
    // Increment s to start of next period
    s.setMilliseconds(s.getMilliseconds() + periodLength + intLength);
  }
  return slots;
}

let date1 = new Date(2020, 8, 20, 15, 15);
let date2 = new Date(2020, 8, 20, 17,  5);

console.log(getSlots(date1, date2, 2, 10));

请注意,这完全填满了允许的时间,结束时没有间隔。此外,时间会被截断为整分钟,因此可能看起来不完全相同或相等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 2020-04-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多