如何在字符串和整点时间内替换时间戳?

时间:2018-12-18 14:46:12

标签: javascript

我有返回数组或代表工作时间的值的函数。数组可以返回一个或两个元素。如果仅返回一个元素,这非常简单,但是当我有两个元素时,这就是寻找如何替换字符串中现有值的方法的问题。这是原始字符串的示例:0600-2200 MAY 15-SEP 30; 0600-2100 OCT 1-MAY 14。我有找到字符串中的时间戳并返回小时的函数。返回数组的示例在这里:[16,15]。该数组具有两个值,我需要用数组0600-2200中的第一个元素替换16并将单词hours附加到该元素上。因此,最终输出应如下所示:16 hours MAY 15-SEP 30; 15 hours OCT 1-MAY 14。这是将时间戳转换为字符串的函数示例:

var timeSt = "0600-2200 MAY 15-SEP 30; 0600-2100 OCT 1-MAY 14";
const calcDifference = range => {
    const time = range.split`-`.map(e => (+e.substr(0, 2) * 60 + (+e.substr(2))) / 60);
    return time[1] - time[0];
};

const diffs = timeSt.match(/\d{4}\-\d{4}/g).map(e => calcDifference(e));
console.log(diffs);

我尝试过的解决方案如下:

var hours = "";
for(var i=0; i < diffs.length; i++){
    hours += timeSt.replace(regex,diffs[i] + " hours ");
}

以下是上面示例产生的输出:

16 hours MAY 15-SEP 30; 16 hours OCT 1-MAY 1415 hours MAY 15-SEP 30; 15 hours OCT 1-MAY 14

似乎整个字符串被追加了两次。我知道为什么会发生这种情况,但仍然无法找到解决此问题的好方法。我注意到的另一件事是一些时间戳值如下所示:0000 - 2359

在这种情况下,转换小时数的函数将返回以下内容:[23.983333333333334]。我想将该值四舍五入到24,这是唯一将值四舍五入到24的情况。我的时间戳看起来像这样:0500-2330函数返回[18.5]并且该值不应舍入。它应该保持原样。如果有人知道如何解决这两个问题的好方法,请告诉我。

1 个答案:

答案 0 :(得分:3)

对于替换问题,您可以在字符串中提供对.replace函数的回调。

const roundMinutes = 15;
const timeSt = "0600-0000 MAY 15-SEP 30; 0600-2145 OCT 1-MAY 14";

const calcDifference = range => {
  const time = range.split`-`.map(e => +e.substr(0, 2) * 60 + (+e.substr(2)));
  let [start, end] = time;
  if (end < start) {
    end += 24 * 60;
  }
  return end - start;
};

const formatted = timeSt.replace(/\d{4}\-\d{4}/g, (range) => {
  const diff = calcDifference(range);
  const full = Math.round(diff / roundMinutes) * roundMinutes;
  const hours = Math.floor(full / 60);
  const minutes = full - hours * 60;
  const time = minutes === 0 ? `${hours}` : `${hours}.${minutes}`
  return `${time} hours`;
})

console.log(formatted)

要更改精度,您可以调整roundMinutes常量。