我有返回数组或代表工作时间的值的函数。数组可以返回一个或两个元素。如果仅返回一个元素,这非常简单,但是当我有两个元素时,这就是寻找如何替换字符串中现有值的方法的问题。这是原始字符串的示例: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]
并且该值不应舍入。它应该保持原样。如果有人知道如何解决这两个问题的好方法,请告诉我。
答案 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
常量。