查找平均时间hh:mm:ss

时间:2019-03-07 17:30:27

标签: javascript time

我有这个小提琴,可以计算毫秒的平均时间。但是,我的数据库以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格式。谢谢。

4 个答案:

答案 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']) );