如何在JavaScript中比较粗糙时间字符串

时间:2018-11-16 16:54:51

标签: javascript string time

实际上我想比较持续时间字符串。

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) ???

3 个答案:

答案 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的字符串。您可以进行简单的查找,以秒为单位提供单位。要走得更远,您甚至可以找到将像andplus这样的连词列表:

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