【问题标题】:Display time duration based on start and end date with interval using moment js使用moment js显示基于开始和结束日期的持续时间和间隔
【发布时间】:2018-01-16 07:49:01
【问题描述】:

我想显示给定 startTime、endTime 和间隔的持续时间数组。

let value = {
  interval: '00:30:00',
  startTime: '03:00:00',
  endTime: '20:00:00'
};

样本输出必须是具有给定间隔的持续时间数组

-startTime 减去间隔,所以新的startTime = 02:30:00

[0] => '02:30 am - 03:00 am'
[1] => '03:00 am - 03:30 am'
[2] => '03:30 am - 04:00 am'
[3] => '04:00 am - 04:30 am'
...... 
[n] => '07:30 pm - 08:00 pm'

这是我的功能

function showTimeIntervals(value) {
  let result = value.interval.split(","); 
  let start = "";
  let timeNotation = '';
  let time = '';
  for(let i in result) {
    let hr = moment(result[i], 'HH:mm').format('HH');
    let min = moment(result[i], 'HH:mm').format('mm');
    hr = (hr != 0) ? parseInt(hr, 10) : '';
    min = (min != 0) ? parseInt(min, 10) : '';
    if(hr != 0) {
      time = hr;
      timeNotation = 'hour';
      start = moment(value.startTime, 'hh:mm a').subtract(hr, 'hour');
    } else {
      time = min;
      timeNotation = 'minutes';
      start = moment(value.startTime, 'hh:mm a').subtract(min, 'minutes');
    }
  }
  var end = moment(value.endTime, 'hh:mm a');
  if(end < start)
    end = end.add(1, 'd');
  var finalResult = [];
  var current = moment(start);
  while (current <= end) {
    finalResult.push(current.format('hh:mm a'));
    current.add(time, timeNotation);
  }
  return finalResult;
}

但它给出的是个人时间而不是持续时间

 [0] => '02:30 am'
 [1] => '03:00 am'
 [2] => '03:30 am'
 [3] => '04:00 am'
 ......
 [n] => '08:00 pm'

这是一个小提琴 -> https://jsfiddle.net/zm368de9/

有没有最简单的方法一时js可以做到这一点?

【问题讨论】:

    标签: javascript datetime momentjs


    【解决方案1】:

    这是使用 moment.js 生成间隔的另一个选项。

    let value = {
      interval: '00:30:00',
      startTime: '03:00:00',
      endTime: '20:00:00'
    };
    
    var inputDataFormat = "HH:mm:ss";
    var outputFormat = "HH:mm a";
    
    var tmp = moment(value.interval, inputDataFormat);
    var dif = tmp - moment().startOf("day");
    
    var startIntervalTime = moment(value.startTime, inputDataFormat).add(-dif, "ms");
    var endIntervalTime = moment(value.startTime, inputDataFormat);
    var finishTime = moment(value.endTime, inputDataFormat);
    
    function prepareIntervals() {
      var intervals = [];
      
      while(startIntervalTime < finishTime) {
        var format = startIntervalTime.format(outputFormat) + " - " + endIntervalTime.format(outputFormat);
        intervals.push(format);
        startIntervalTime.add(dif, "ms");
        endIntervalTime.add(dif, "ms");
      }
      
      return intervals;
    }
    
    console.dir(prepareIntervals());
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.js"&gt;&lt;/script&gt;

    【讨论】:

      【解决方案2】:

      您只是在推送当前时间值,而不是整个间隔。只需对最后一个 while 循环稍作修改就可以解决问题。

      这里也做了一些改动

      让结果 = value.interval.split(",")

      可以替换为

      result = value.interval
      

      因为result.interval 没有,。

      另外,end 和start 之间的比较可以使用moment 的内置isBefore 方法来完成。

      let value = {
        interval: '00:30:00',
        startTime: '03:00:00',
        endTime: '20:00:00'
      };
      
      function showTimeIntervals(value) {
        let result = value.interval; 
        let start = "";
        let timeNotation = '';
        let time = '';
        for(let i in result) {
          let hr = moment(result, 'HH:mm').format('HH');
          let min = moment(result, 'HH:mm').format('mm');
          hr = (hr != 0) ? parseInt(hr, 10) : '';
          min = (min != 0) ? parseInt(min, 10) : '';
          if(hr != 0) {
            time = hr;
            timeNotation = 'hour';
            start = moment(value.startTime, 'hh:mm a').subtract(hr, 'hour');
          } else {
            time = min;
            timeNotation = 'minutes';
            start = moment(value.startTime, 'hh:mm a').subtract(min, 'minutes');
          }
        }
        var end = moment(value.endTime, 'hh:mm a');
        if(end.isBefore(start))
          end = end.add(1, 'd');
        var finalResult = [];
        var current = moment(start);
        while (current <= end) {
          currentInterval=current.format('hh:mm a') + ' - '; //This will add the start of interval
          current.add(time, timeNotation);
          currentInterval+=current.format('hh:mm a'); //This will add end of interval
          finalResult.push(currentInterval); //Add the complete interval to your result
        }
        return finalResult;
      }
      
      console.log(showTimeIntervals(value))
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.js"&gt;&lt;/script&gt;

      希望对你有帮助!!

      【讨论】:

      • 感谢您的帮助 :) 我认为 @Artyom 有一个缩小的代码
      • 乐于助人:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多