javascript - 从 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'));
解决方案
我不知道 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
推荐阅读
- javascript - 将值/文本设置为下拉列表
- python - Python:终止子进程而不访问 subprocess.Popen 对象?
- ios - 如何使用 ReSwift 组织上传/下载方法的动作状态流
- ios - 如何仅刷新/重绘 uicollectionview 中的补充视图?
- c - 在“/getc.c”eclipse c ubuntu 中找不到源文件
- java - ##0.0E0 的 DecimalFormat 模式返回 1.235E3
- oracle - 在 Kitematic 下启动 Oracle 数据库
- javascript - 如何使用 Node 要求在另一个 Javascript 文件中定义一个类的函数?
- c# - 带有 .net 的 Web 服务未连接到内部信息服务中的 mysql db
- android - 垂直滚动两帧布局或片段