首页 > 解决方案 > 从 momentJS 持续时间获取时间计算

问题描述

我的表中有一个要排序的字段。该字段包含来自 MomentJS 持续时间计算的字符串。例如“20 分钟”、“10 小时 1 分钟”等。如果我想使用排序函数,我需要将该字符串格式化回我拥有的最低时间分辨率,即分钟。像这样:a: "20 Minutes" => 20. b: "10 Hours 1 Minute" => 10*60 + 1 = 601. 所以当按降序排序时,b 会排在 a 之前。

我制作了这个功能,但它确实是硬编码的,所以我真的很想看看其他方法来解决它。谢谢!

function getTimeFromDuration(duration) {
    const str = duration.split(' ');
    const durationArray = ['Minute', 'Minutes', 'Hour', 'Hours', 'Day', 'Days'];
    const calcArr = [];
    let sum = 0;
    for (let i=0; i<str.length; i++) {
        const isNum = !isNaN(str[i]);
        const isDuration = durationArray.includes(str[i]) > -1;
        if (isNum) {
            calcArr.push(parseInt(str[i]));
        }
        else if (isDuration) {
            switch(str[i]) {
                case 'Minute':
                case 'Minutes':
                    calcArr.push(1);
                    break;
                case 'Hour':
                case 'Hours':
                    calcArr.push(60);
                    break;
                case 'Day':
                case 'Days':
                    calcArr.push(60*24);
                    break;
            }
        }
    }

    for (let j=0; j<calcArr.length; j=j+2) {
        sum+= calcArr[j]*calcArr[j+1];
    }

 return sum;
}


 console.log(getTimeFromDuration('1 Day 1 Hour 20 Minutes'));

标签: javascriptstringmomentjs

解决方案


我不知道 Moment 或其他地方的解析函数将处理这些类型的字符串。如果您的输入字符串格式一致并且仅限于天、小时和分钟,那么解析它们应该不会那么困难。以下是一种沿原始函数行的方法,由于将字符串拆分为每个持续时间“块”然后规范化持续时间描述符(小写和单数),因此您可以轻松访问值,因此更加紧凑乘数对象。

也就是说,如果您的原始数据包含 Moment 持续时间对象而不仅仅是字符串表示,那么有更简单的方法可以做到这一点。

const getMinutes = (s) => {
  const multipliers = { day: 1440, hour: 60, minute: 1 };
  const durations = s.split(/\s(?=\d)/);
  let minutes = 0;
  for (const d of durations) {
    let [n, interval] = d.split(' ');
    n = Number(n);
    interval = interval.toLowerCase();
    if (interval.endsWith('s')) {
      interval = interval.slice(0, -1);
    }
    
    minutes += n * multipliers[interval];
  }
  
  return minutes;
};

const result = getMinutes('1 Day 1 Hour 20 Minutes');
console.log(result);
// 1520


推荐阅读