如何将诸如1h 20m
,30m
,1 h
,1 h 30m
,2:45
之类的字符串解析为时间跨度。拒绝34r
45g
,10:75
等时
尝试使用以下代码:
function parse(str){
var result = 0
// ignore commas
str = str.replace(/(\d),(\d)/g, '$1$2')
str.replace(duration, function(_, n, units){
units = getUnits(units)
|| getUnits[units.toLowerCase().replace(/s$/, '')]
|| 1
result += parseFloat(n, 10) * units;
})
return result;
}
function getUnits(unit){
var to_ret;
switch(unit){
case "seconds":
case "second":
case "secs":
case "sec":
case "s": to_ret = 0; break;
case "minutes":
case "minute":
case "mins":
case "min":
case "m": to_ret = 1; break;
case "hours":
case "hour":
case "hr":
case "hrs":
case "h": to_ret = 60; break;
case "days":
case "day":
case "d": to_ret = 24 * 60; break;
case "weeks":
case "week":
case "w": to_ret = 7 * 24 * 60; break;
default: to_ret = undefined;
}
return to_ret;
}
插入以上代码的代码:https://plnkr.co/edit/7V0Lgj?p=preview
但是,以上内容不足以识别
2:45
的含义,而不会给出34r
,45g
,10:75
的错误。现在,我可以添加更多条件,但是想知道是否有解决上述问题的简单方法
最佳答案
格式H:M有点不同,所以我不会尝试使用1个regex / 1循环来解决它。另外,当无法将字母解析为小时/分钟等时,为什么还要乘以* 1呢?因此,通过一些错误处理,这应该没问题:plnkr
function parse(str){
var result = 0
var error = null;
// ignore commas
str = str.replace(/(\d),(\d)/g, '$1$2')
if (str.indexOf(':')>=0) {
var arr = str.split(':')
if (arr.length != 2) error = true;
else result = parseInt(arr[0])*60+ parseInt(arr[1])
}
else str.replace(duration, function(_, n, units){
units = getUnits(units)
|| getUnits[units.toLowerCase().replace(/s$/, '')]
|| undefined;
if (typeof units === 'undefined') error = true;
else result += parseFloat(n, 10) * units;
})
return error?null:result;
}