实际上我想比较持续时间字符串。
var str1 = "2 Hours 15 Minutes"; //possible value "2 Hr 15 Min"
var str2 = "3 Hours 9 Minutes"; //possible value "3 Hr 9 Min"
if(str1 > str2) ???
答案 0 :(得分:1)
您需要解析该字符串,并将其转换为某个通用值(在我的代码中为分钟),然后比较数字。
由于字符串具有标准结构,因此可以对String.match()
使用简单的正则表达式来提取数字。将第一个数字乘以60,然后加上第二个数字,得到分钟数。
function parseTimeString(str) {
var hours = str.match(/\d+(?=\s+(Hours|Hr))/g) || [0];
var min = str.match(/\d+(?=\s+Min)/g) || [0];
return +hours[0] * 60 + +min[0];
}
function compareTimeStrings(str1, str2) {
return parseTimeString(str1) > parseTimeString(str2);
}
var str1 = "2 Hours 15 Minutes"; //possible value "2 Hr 15 Min"
var str2 = "3 Hours 9 Minutes"; //possible value "3 Hr 9 Min"
console.log(compareTimeStrings(str1, str2));
// parseTimeString examples
console.log(parseTimeString(''));
console.log(parseTimeString('2 Hours')); // 120
console.log(parseTimeString('5 Minues')); // 5
console.log(parseTimeString('5 Minutes 2 Hours')); // 125
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
如果您想要一个通用的解决方案,则需要确定需要支持的概括级别。范围从简单的正则表达式解析到更适合神经网络的某种范围。假设使用前者,则更简单的概括是使用已知单位支持和格式化为number units
的字符串。您可以进行简单的查找,以秒为单位提供单位。要走得更远,您甚至可以找到将像and
或plus
这样的连词列表:
const units = {
'seconds': 1,
'minutes': 60,
'hours': 3600,
'hr': 3600,
'min': 60,
'sec': 1,
'days': 86400
// etc...
}
const stopwords = /and|plus|\+/gi // will be replaced with space
function gteSeconds(str) {
let times = str
.replace(stopwords, ' ')
.match(/\d+\s+\w+/g).map(t => t.split(/\s+/))
return times.reduce((total, [time, unit]) => total + time * units[unit.toLowerCase()]
, 0)
}
console.log(gteSeconds('3 Hours 9 Minutes'))
console.log(gteSeconds('20 seconds'))
console.log(gteSeconds('20 seconds 2 minutes'))
console.log(gteSeconds('1 Hr and 2 sec'))
console.log(gteSeconds('20 sec + 2 sec'))
答案 2 :(得分:0)
如果您想正确解决问题,那不是小问题!
我建议使用其中一种可以轻松解析日期并具有比较功能的库。
我想到的第一个是moment.js
,它具有比较惊人的持续时间-moment-duration
。
矩持续时间必须使用以下语法构建,例如:
let duration = moment.duration(1, 'minutes);
(更多信息:https://momentjs.com/docs/#/durations/creating/)
您必须将持续时间字符串分成若干部分,包括数字和持续时间单位:
let str1 = '2 Hours 15 Minutes';
let durationStrings = str1.match(/\d+ [a-zA-Z]+/g);
完成此步骤后,您将获得类似于以下内容的字符串数组:
['2 hours', '15 minutes'];
在那之后,我们需要第二次分割字符串,以建立适当的持续时间。然后,我们将使用我们的值来构建最终持续时间:
// Create empty duration first...
let duration = moment.duration();
durationStrings.forEach((durationString) => {
let durationArguments = durationString.split(' '); // We just use space as delimiter
if (durationArguments.length === 2) {
duration.add(Number(durationArguments[0]), durationArguments[1]);
}
});
console.log(duration);
如果您检查最终持续时间对象,则该对象应在迭代后包含适当的持续时间。
现在将其包装到名为convertToDuration(string)
的函数中。
请注意两件事:
durationString
包含数字,然后是空格,然后是持续时间表达式string
转换为number
,因为moment-duration
假定第一个参数是数字现在,唯一要做的就是使用上述方法建立两个持续时间并进行比较,例如:
let duration1 = convertToDuration(str1);
let duration2 = convertToDuration(str2);
// If duration subtraction is negative, first one is smaller!
let subtractionResult = duration1.subtract(duration2).as('milliseconds');
if (subtractionResult < 0) {
// Your logic here
}
您可以在这里找到我的解决方案: https://jsbin.com/berijuduza