如何使用 Javascript 将持续时间字符串解析为秒
How to parse a duration string into seconds with Javascript?
我正在尝试使用 Javascript 解析用户输入字符串的持续时间(以秒为单位)。
以下是我希望能够处理的一些示例输入:
- "1小时2分钟"
- "1天2小时3分钟"
- "1天2小时37分钟"
- "1天2分钟"
- "3天20小时"
关键组件是 1) 天,2) 小时 3) 分钟,但某些组件可能并不总是包括在内。
我的攻击计划是使用 .match 和正则表达式。只要我能得到单词的第一个字母,我就会知道前面的数字是做什么的,并且能够处理单词的所有不同格式(例如小时、小时、小时、小时)。但是,由于我正在为此学习正则表达式,结果证明它比我想象的要复杂得多。
任何帮助或建议将不胜感激!
字符串中的天/小时/分钟顺序是否得到保证? 如果没有,为每个单独执行正则表达式可能会更容易。 像这样的东西?
function getSeconds(str) {
var seconds = 0;
var days = str.match(/('d+)'s*d/);
var hours = str.match(/('d+)'s*h/);
var minutes = str.match(/('d+)'s*m/);
if (days) { seconds += parseInt(days[1])*86400; }
if (hours) { seconds += parseInt(hours[1])*3600; }
if (minutes) { seconds += parseInt(minutes[1])*60; }
return seconds;
}
您可以在正则表达式中使用可选的子字符串来匹配任何组合,如您所描述的那样:
/('d+)'s*d(ays?)?'s*('d+)'s*h(ours?)?'s*('d+)'s*m(in(utes?)?)?/
这至少需要d
、h
和m
,但接受常见的缩短。
您可以使用此代码将字符串分解为数字,后跟单位字符串:
function getPieces(str) {
var pieces = [];
var re = /('d+)['s,]*([a-zA-Z]+)/g, matches;
while (matches = re.exec(str)) {
pieces.push(+matches[1]);
pieces.push(matches[2]);
}
return(pieces);
}
then 函数返回一个数组,例如 ["1","day","2","hours","3","minutes"]
其中数组中的交替项是值,然后是该值的单位。
因此,对于字符串:
"1 day, 2 hours, 3 minutes"
该函数返回:
[1, "day", 2, "hours", 3, "minutes"]
然后,您可以只检查每个值的单位以决定如何处理它。
工作演示和测试用例在这里:http://jsfiddle.net/jfriend00/kT9qn/。 该函数容忍可变数量的空格,并且在数字和单位标签之间取一个逗号、一个空格或两者都不带。 它期望在单元后有一个空格或逗号(至少一个)。
var str = "1 day, 2 hours, 3 minutes";
var seconds = 0;
str.replace (/'s*,?('d+)'s*(?:(d)(?:ays?)?|(h)(?:ours?)?|(m)(?:in(?:utes?)?)?)/g, function (m0, n, d, h, m) {
seconds += +n * (d ? 24 * 60 * 60 : h ? 60 * 60 : 60);
return m0;
});
在这里,我使用 replace 不是为了更改字符串,而是逐个处理匹配项。注意天,小时分钟可以按任何顺序排列。
接受答案的更通用版本,也接受月份和秒。
const getSeconds = str => {
let seconds = 0;
let months = str.match(/('d+)'s*M/);
let days = str.match(/('d+)'s*D/);
let hours = str.match(/('d+)'s*h/);
let minutes = str.match(/('d+)'s*m/);
let secs = str.match(/('d+)'s*s/);
if (months) { seconds += parseInt(months[1])*86400*30; }
if (days) { seconds += parseInt(days[1])*86400; }
if (hours) { seconds += parseInt(hours[1])*3600; }
if (minutes) { seconds += parseInt(minutes[1])*60; }
if (secs) { seconds += parseInt(secs[1]); }
return seconds;
};
相关文章:
- 在jQuery中,短距离长持续时间的精细字体大小动画
- 创建一个倒计时计时器脚本,该脚本计算声音文件的持续时间,而不是特定的日期
- 输入视频文件时获取视频持续时间
- 无填充的滚动魔术持续时间
- 我需要在每5秒内调用一个函数,并重置持续时间
- jQuery动画的持续时间就像一个延迟
- 如何在特定时间重新加载page.php,例如:07:45.非持续时间,例如:每5秒
- 如何在dhtmlxgantt中显示灯箱中的开始日期、结束日期和持续时间
- Javascript - 具有音高和持续时间控制的文本到语音
- setTimeout() 函数在超时持续时间之前调用
- HTML 5 音频 :是否有在更改缓冲持续时间时触发的事件
- 如何获取所有旅行模式的距离和持续时间,例如驾驶,公交,骑自行车,在我的页面中步行以及将其存储在数据库中
- 当用户在文本框中输入日期时,如何计算一年的持续时间
- 如何使用 Javascript 将持续时间字符串解析为秒
- 速度.js动画两个属性时持续时间不同
- d3 动画中的持续时间
- Webkit-css随持续时间变化
- JS:设置src更改的动画持续时间
- 将总秒数转换为带有时刻.js的ISO 8601持续时间字符串
- 使用javascript按照持续时间对字符串格式的数据进行排序