Расчетное среднее от ЧЧ: мм в JS - PullRequest
1 голос
/ 22 февраля 2020

у меня есть следующий массив, который включает в себя чч: мм

var times= [ '28:06', '27:56', '28:30']

я пытаюсь вычислить среднее количество часов и минут из вышеуказанного массива

ниже мой код

var times= [ '28:06', '27:56', '28:30'],
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]).getTime();   
}
var avg = new Date(date/times.length);
result = offsetify(avg.getHours()) + ':' + offsetify(avg.getMinutes());
console.log(result);

, что дает мне 4:10, что неверно, так как среднее должно быть где-то около 27: ...

что я здесь делаю не так

Ответы [ 4 ]

2 голосов
/ 22 февраля 2020

Вы можете просто найти среднее значение часа и минуты отдельно

var times= [ '28:06', '27:56', '28:30']

function getAverage(isHourPart){
	var sum = 0;
	times.forEach(function(value){
  	sum+=parseInt(value.split(':')[isHourPart?0:1], 10);
  });
  var avg = Math.floor(sum/times.length);
  return avg<10 ? '0' + avg : avg;
}

console.log(getAverage(true)+":"+getAverage(false));

Но если учесть совокупное значение часа и минуты

var times= [ '28:06', '27:56', '28:30']

function getSum(){
	var sum = 0;
	times.forEach(function(value){
  	var item = value.split(':');
  	sum+=parseInt(item[0], 10) * 60 + parseInt(item[1], 10);
  });
  return sum;
}

function getFormattedText(value){
	return value<10?"0"+value:value;
}

var totalMinutes = getSum()/3;

var hour = Math.floor(totalMinutes/60);
var minute = Math.floor(totalMinutes - hour * 60);

console.log(getFormattedText(hour)+":"+getFormattedText(minute));
2 голосов
/ 22 февраля 2020

Я бы использовал .map для преобразования каждой временной строки в счетчик минут (например, 28:06 -> (28 * 60) + 6 = 1686), затем суммировал массив и делил его на длину. Получив среднее количество секунд, вы можете перевернуть процесс, чтобы создать еще одну HH:mm строку:

var times = ['28:06', '27:56', '28:30'];
const timeMins = times.map((str) => {
  const [hours, minutes] = str.split(':').map(Number);
  return minutes + (hours * 60);
});
const totalMins = timeMins.reduce((a, b) => a + b);
const avgMins = totalMins / times.length;
const hours = Math.floor(avgMins / 60);
const minutes = avgMins % 60;
console.log(hours + ':' + Math.round(minutes));
1 голос
/ 22 февраля 2020
var times= [ '28:06', '27:56', '28:30'];

var total=0;
for(var i=0;i<times.length;i++) {
    var hour=parseInt(times[i].split(':')[0]);
    var minute=parseInt(times[i].split(':')[1]);
    total+=((hour*60)+minute);
}
var avg=parseInt(total/times.length);
var result=parseInt(avg/60)+":"+(avg%60);
console.log(result);
1 голос
/ 22 февраля 2020

При преобразовании> 24 ч в день вы прошли день, когда вы делали среднее значение, среднее значение составляет всего go> 24 ч, следовательно, также и день.

проверьте avg.getDay(), чтобы выполнить правое смещение с часом.

var times= [ '28:06', '27:56', '28:30'],
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]).getTime();   
}
var avg = new Date(date/times.length);
result = offsetify((avg.getDay() * 24) + avg.getHours()) + ':' + offsetify(avg.getMinutes());
console.log(result);

Примечание. Я также рекомендую вам использовать https://momentjs.com/docs/# / durations / , если в вашем проекте задействовано много времени c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...