我有这个小提琴,可以计算毫秒的平均时间。但是,我的数据库以hh:mm:ss格式存储数据。 fiddle
var times= [ '00:00:03.00', '00:00:05.00', '00:00:02.00', '00:00:06.00'],
date = 0,
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, tarr[0], tarr[1], tarr[2].split('.')[0], tarr[2].split('.')[1]).getTime();
}
var avg = new Date(date/times.length);
result = offsetify(avg.getHours()) + ':' + offsetify(avg.getMinutes()) + ':' + offsetify(avg.getSeconds()) + '.' + offsetify(avg.getMilliseconds());
document.write(result);
我需要确保将秒平均为例如8.75,然后将平均值返回为00:00:9 使用这样的数组:
var times= [ '00:00:03', '00:00:05', '00:00:020', '00:00:07']
有人可以帮我修改此格式以正确舍入hh:mm:ss格式。谢谢。
答案 0 :(得分:1)
您可以得到秒数,将值取整并建立一个平均时间的新字符串。
function getAverageTime(array) {
var times = [3600, 60, 1],
parts = array.map(s => s.split(':').reduce((s, v, i) => s + times[i] * v, 0)),
avg = Math.round(parts.reduce((a, b) => a + b, 0) / parts.length);
return times
.map(t => [Math.floor(avg / t), avg %= t][0])
.map(v => v.toString().padStart(2, 0))
.join(':');
}
console.log(getAverageTime(['00:00:03', '00:00:05', '00:00:020', '00:00:07']));
console.log(getAverageTime(['00:00:03', '00:30:05', '00:30:020', '03:00:07']));
ES5
function getAverageTime(array) {
var times = [3600, 60, 1],
parts = array.map(function (s) {
return s.split(':').reduce(function (s, v, i) {
return s + times[i] * v;
}, 0);
}),
avg = Math.round(parts.reduce(function (a, b) {
return a + b;
}, 0) / parts.length);
return times
.map(function (t) {
var value = Math.floor(avg / t);
avg %= t;
return value;
})
.map(function (v) {
return v.toString().padStart(2, 0);
})
.join(':');
}
console.log(getAverageTime(['00:00:03', '00:00:05', '00:00:020', '00:00:07']));
console.log(getAverageTime(['00:00:03', '00:30:05', '00:30:020', '03:00:07']));
答案 1 :(得分:0)
var seconds = avg.getMilliseconds() > 500 ? avg.getSeconds() + 1 : avg.getSeconds();
result = offsetify(avg.getHours()) + ':' + offsetify(avg.getMinutes()) + ':' +
offsetify(seconds);
基本上只是检查ms是否大于50,如果可以,则可以手动将秒加1,如果不保留秒则保持原样。不知道您是否还希望偏移秒。
答案 2 :(得分:0)
首先,使用Date.getTime()
将所有时间转换为其UNIX时间戳,生成一个数组,然后取平均结果。示例:]
let times = [
1551984787316,
1551984789662,
1551984790162,
1551984790730,
1551984791310
]
let average = ( values ) => {
let sum = 0;
for( let i = 0; i < values.length; i++ ){
sum += parseInt( values[i], 10 ); // base 10
}
return Math.floor( sum/values.length );
}
let avgTime = average( times );
let avgDate = new Date( avgTime );
console.log( avgDate );
答案 3 :(得分:0)
Date
可用于将它们转换为毫秒:
function averageTime(arr) {
var sum = arr.reduce(function(a, b) { return a + +new Date('1970T' + b + 'Z'); }, 0);
return new Date(sum / arr.length + 500).toJSON().slice(11, 19);
}
console.log( averageTime(['00:00:03.00', '00:00:05.00', '00:00:02.00', '00:00:06.00']) );
console.log( averageTime(['00:00:03', '00:00:05', '00:00:20', '00:00:07']) );