从格式化的时间字符串中获取秒数

Get amount of seconds from a formatted time string

如何理想地使用 momentjs.

1m15s 等时间字符串转换为 75s7575000

我尝试使用 new Date('1m1s') 解析该字符串,但它给出了 Invalid Date.

我不想求助于正则表达式:

const second = (function () {
    const countdownStep = '1h1m1s'.match(
        /(?:(?<h>\d{0,2})h)?(?:(?<m>\d{0,2})m)?(?:(?<s>\d{0,2})s)?/i
    );
    return (
        (countdownStep.groups.h
            ? parseInt(countdownStep.groups.h) * 3600
            : 0) +
        (countdownStep.groups.m
            ? parseInt(countdownStep.groups.m) * 60
            : 0) +
        (countdownStep.groups.s ? parseInt(countdownStep.groups.s) : 0)
    );
})();

我试过了,对你有帮助吗

let d = '1H1s';
d = d.toLowerCase();
let sec = 0;
if(d.indexOf('h') > -1) {
    if (d.indexOf('m') == -1) {
        d = d.substring(0, d.indexOf('h') + 1) +"0m"+d.substring(d.indexOf('h') + 1);
    }
}
let newDs = d.replace('h',':').replace('m',':').replace('s','').split(':');
newDs.forEach((v, i) => sec += Math.pow(60, (newDs.length - i - 1)) * v);
console.log(sec);

可以使用momentjs的duration接口:

let s = '1m15s';

// convert to duration format and pass to momentjs
let secs = moment.duration('PT' + s.toUpperCase()).as("seconds");

console.log("seconds: ", secs);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

没有图书馆,它可能是:

const unit = { s: 1, m: 60, h: 60*60 };
let s = '1m15s';
let secs = s.toLowerCase().match(/\d+./g)
            .reduce((acc, p) => acc + parseInt(p) * unit[p.at(-1)], 0);
console.log("seconds: ", secs);

另一种使用普通 js 的方法:

const getSecondsFromString = (str) => {
  const hourIndex = str.indexOf("h")
  const minuteIndex = str.indexOf("m")
  const secondIndex = str.indexOf("s")
  let hours = 0
  let minutes = 0
  let seconds = 0

  if (hourIndex !== -1) {
    hours = Number(str.substring(0, hourIndex))
  }

  if (minuteIndex !== -1) {
    if (hourIndex !== -1) {
      minutes = Number(str.substring(hourIndex + 1, minuteIndex))
    } else {
      minutes = Number(str.substring(0, minuteIndex))
    }
  }

  if (secondIndex !== -1) {
    if (minuteIndex !== -1) {
      seconds = Number(str.substring(minuteIndex + 1, secondIndex))
    } else if (hourIndex !== -1) {
      seconds = Number(str.substring(hourIndex + 1, secondIndex))
    } else {
      seconds = Number(str.substring(0, secondIndex))
    }
  }

  return hours * 3600 + minutes * 60 + seconds
}

另一种没有 substring/replace 的方法,时间复杂度为 O(n);

const getSecondsFromTimeString = (timeString) => {
    let numberBeforeNextChar = 0;
    let seconds = 0;
  
    const symbolToSecondMap = {
        "s" : 1,
        "m" : 60,
        "h" : 60*60,
        "d" : 60*60*24
    };
  
    for (let i = 0; i < timeString.length; i++) {
        let char = timeString.charAt(i);
        
        if((+ char) <= 9  && (+ char) >= 0 ){
            numberBeforeNextChar = (numberBeforeNextChar * 10) + parseInt(char);
            continue;
        }
    
        if(char.toLowerCase() == char.toUpperCase()){
            throw "Non alphanumeric symbol encountered";
        }

        if(symbolToSecondMap[char] === undefined){
            throw "Invalid date alphabet encountered";
        }
        
        seconds = seconds + (numberBeforeNextChar * symbolToSecondMap[char]);
        numberBeforeNextChar = 0;
    
  }
  
  return seconds;
} 



console.log(getSecondsFromTimeString('1s'))
console.log(getSecondsFromTimeString('10s'))
console.log(getSecondsFromTimeString('1s4m10d3h'))
console.log(getSecondsFromTimeString('1s4m03h1h'))
console.log(getSecondsFromTimeString('10d'))