我正在使用在此网站上找到的代码来平均MM:SS.mmm(Averaging Times using Javascript)中的圈速
它很好用,直到结果在十分之一处为零为止。例如,结果应为01:00.096,但是,零将被删除,答案为01:00.96
我简化了“时间”的输入以突出问题。
我研究了不同的格式问题,尝试将字符串转换为数字,并且我研究了offsetify
函数,认为它在某种程度上错误地解释了毫秒。
我是JavaScript的新手,没有经过正式的培训,但是喜欢业余编程。我从本网站上的示例中学到了很多,可以在自己的小应用程序中使用。
var times = ['01:00.096'];
var date = 0
var result = '';
function offsetify(t)
{
return t < 10 ? '0' + t : t;
}
for(var x = 0; x < times.length; x++ ) {
var tarr = times[x].split(':');
date += new Date(0, 0, 0, 0, tarr[0], tarr[1].split('.')[0], tarr[1].split('.')[1]).getTime();
}
var avg = new Date(date/times.length);
result = offsetify(avg.getMinutes()) + ':' + offsetify(avg.getSeconds()) + '.' + offsetify(avg.getMilliseconds());
答案 0 :(得分:0)
您的函数offsetify(t)
会附加一个0
,以防您的分钟/秒只有一位数字-但是毫秒应该是3位数字!
您可以创建一个新函数,如果0
已经是2位数字(小于100),则追加00
,如果只有一位数字(小于10),并且仅返回如果已经是3位数字,则返回结果。
function offsetifyMilliseconds(t)
{
return t < 10 ? '00' + t : t < 100 ? '0' + t : t;
}
然后做
result = offsetify(avg.getMinutes()) + ':' + offsetify(avg.getSeconds()) + '.' + offsetifyMilliseconds(avg.getMilliseconds());
但是,最新版本的Javascript(来自ES2017)可以在任何字符串上访问.padStart()
函数:
padStart()方法用另一个字符串(如果需要,可以多次)填充当前字符串,直到结果字符串达到给定的长度为止。从当前字符串的开头(左侧)开始应用填充。
使用此方法将使您的代码更具可读性(尽管您必须先将数字结果转换为字符串)。您甚至可以更改您的offsetify
函数以使用此方法,并防止代码重复!
在下面的示例中,我将2定义为该方法的默认填充长度,但是如果要使用毫秒,则可以将附加参数传递给该函数:
var times = ['01:00.096'];
var date = 0
var result = '';
function offsetify(t, len = 2)
{
return t.toString().padStart(len, '0');
}
for(var x = 0; x < times.length; x++ ) {
var tarr = times[x].split(':');
date += new Date(0, 0, 0, 0, tarr[0], tarr[1].split('.')[0], tarr[1].split('.')[1]).getTime();
}
var avg = new Date(date/times.length);
var minutes = offsetify(avg.getMinutes());
var seconds = offsetify(avg.getSeconds());
var milliseconds = offsetify(avg.getMilliseconds(), 3);
result = minutes + ':' + seconds + ':' + milliseconds;
console.log(result);
答案 1 :(得分:0)
看到0下降的原因是因为在offsetify函数中具有
return t < 10 ? '0' + t : t;
,并且您将其传递的值96不小于10,因此该函数返回96
。
如果您能够找到日期时间格式的库,例如date-fns或moment,则应该使用一个,那太好了!让图书馆为您完成工作。
如果您希望练习对学习非常有用,请使用
s.padStart(3, '0')
毫秒,
s.padStart(2, '0')
几分钟。例如,以毫秒为单位:
> "5".padStart(3, "0")
'005'
> "55".padStart(3, "0")
'055'
> "383".padStart(3, "0")
'383'