2012-05-06 151 views
2

我正在使用Phonegap和JQuery構建應用程序。使用Javascript平均時間

該應用程序在格式中存儲(使用window.localStorage)一組時間(不超過10次)。

HH:MM:SS.mm 

有列表如00多項 '零' 時間:00:00.00' ,這iphonegap,JavaScript的 消除使用..

function removeA(arr){ 
     var what, a= arguments, L= a.length, ax; 
     while(L> 1 && arr.length){ 
      what= a[--L]; 
      while((ax= arr.indexOf(what))!= -1){ 
       arr.splice(ax, 1); 
      } 
     } 
     return arr; 
    } 

    scores.sort(); 
    removeA(scores,'00:00:00.00'); 

讓我離開我與首先是最快的時間,只有有價值的時間。

我需要從剩餘的值中產生這些時間的平均值。

eg: 00:00:03.00 
    00:00:05.00 
    00:00:02.00 
    00:00:06.00 

= 00:00:04.00 

在此先感謝:)

回答

2
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()); 

DEMO

+0

@Deano您可以檢查這個答案 – thecodeparadox

+0

這也工作得很好! – Deano

+0

@Deano,我認爲我的工作更簡單,更好,謝謝 – thecodeparadox

2

如果你要還具有毫秒值,你要考慮他們,然後將時間轉換爲毫秒。現在,添加它們並將它們除以記錄數。否則,將所有內容都轉換爲秒並查找平均值 - 當然,您會在幾秒鐘內得到答案。

如果花很少的時間仔細考慮,轉換就非常簡單。以下是如何轉換。

到毫秒:

function convertToMS(timeStr) {  // timeStr in format 'HH:MM:SS.mm' 
    var I = parseInt; // for brevity 
    var t = timeStr, 
     h = I(t.substr(0,2)), 
     m = I(t.substr(3,2)), 
     s = I(t.substr(6,2)), 
     ms = I(t.substr(9,2)); 

    return h * 3600000 + m * 60000 + s * 1000 + ms; 
} 

到秒:

function convertToS(timeStr) {  // timeStr in format 'HH:MM:SS[.mm]' -- .mm is ignored. 
    var I = parseInt; // for brevity 
    var t = timeStr, 
     h = I(t.substr(0,2)), 
     m = I(t.substr(3,2)), 
     s = I(t.substr(6,2)); 

    return h * 3600 + m * 60 + s; 
} 

轉換的完成,把它們加起來,發現平均後。

UPDATE: 轉換回格式「HH:MM:SS.mm」,我們換回來的時間到時,分,秒「塊」和(如果適用)毫秒。

function chunkifyFromSec(time) { // time in s 
    var t = "", 
     h = Math.floor(time/3600), 
     m = Math.floor((t - (h * 3600))/60), 
     s = t - (h * 3600) - (m * 60); 
    return { 
     HH: h, MM: m, SS: s, mm: 0 
    }; 
} 
function chunkifyFromMS(time) { // time in ms 
    var t = "", 
     h = Math.floor(time/3600000), 
     m = Math.floor((t - (h * 3600000))/60000), 
     s = Math.floor((t - (h * 3600000) - (m * 60000))/1000), 
     mm = t - (h * 3600000) - (m * 600000) - (s * 1000); 
    return { 
     HH: h, MM: m, SS: s, mm: mm 
    }; 
} 

然後,我們在格式返回字符串 'HH:MM:SS.mm' 使用此:

function toTimeStr(chunks) { 
    return 
      (chunks.HH < 0 ? '0' : '') + chunks.HH + ":" 
      += (chunks.MM < 0 ? '0' : '') + chunks.MM + ":" 
      += (chunks.SS < 0 ? '0' : '') + chunks.SS + "." 
      += (chunks.mm < 0 ? '0' : '') + chunks.mm 
} 
+0

如果我想轉換平均毫秒結果以匹配我一直使用的格式[HH:MM:SS.mm]? – Deano

+0

我編輯了這篇文章,你檢查了嗎? –

+0

返回的平均的結果是:2059的chunkify函數返回2012-05-06 12:26:34.395該app [2341:707] [INFO]對象: HH = 0 MM = 0 SS = 0 毫米= 0 – Deano

0

要返回毫秒或秒答案:

var times = ["00:00:03.00", "00:00:05.00", "00:00:02.00", "00:00:06.00"]; 

function averageTimes(times,unit) { 
    if (!times) { 
     return false; 
    } 
    else { 
     var totalMilliseconds = 0, hours, minutes, seconds, milliseconds, parts; 
     for (var i = 0, len = times.length; i < len; i++) { 
      parts = times[i].split(':'); 
      hours = parseInt(parts[0], 10) * 3600000; 
      minutes = parseInt(parts[1], 10) * 60000; 
      seconds = parseInt(parts[2].split('.')[0], 10) * 1000; 
      milliseconds = parseInt(parts[2].split('.')[1], 10); 
      totalMilliseconds += (hours + minutes + seconds + milliseconds); 
     } 
     if (!unit || unit.toLowerCase() == 'ms'){ 
      return totalMilliseconds/times.length + ' milliseconds'; 
     } 
     else if (unit.toLowerCase() == 's') { 
      return (totalMilliseconds/1000)/times.length + ' seconds'; 
     } 

    } 
} 

// parameters: 
// times: an array of times in your supplied format, 'HH:MM:SS:mm', 
// unit: a string ('ms' or 's'), denoting whether to return milliseconds or seconds. 
var average = averageTimes(times,'s'); 
console.log(average);​ 

JS Fiddle demo

參考文獻:

0

我沒有使用Javascript太多的經驗,所以我可能有一些語法錯誤,但我認爲你可以做這樣的事情

var i = 0; 
var totalTime = 0.0; 
for (i=0; i < scores.length; i++) { 
    var hours = parseFloat(scores[i].substring(0, 2)); //get numeric value for hours 
    var minutes = parseFloat(scores[i].substring(3,5)); //get numeric value for minutes 
    var seconds = parseFloat(scores[i].substring(6)); //get numeric for the seconds 

    var time = ((hours * 60) + minutes) * 60 + seconds; //60 minutes in an hour, 60 seconds in a minute 
    totalTime += time; 
} 

var avgTime = totalTime/scores.length; 

var avgHours = Math.floor(avgTime/3600); //60*60 
var avgHoursStr = String(avgHours); 

var avgMinutes = Math.floor((avgTime % 3600)/60); //mod to get rid of the hours 
var avgMinutesStr = String(avgMinutes); 

var avgSeconds = avgTime - avgHours*3600 - avgMinutes*60; //get the remainder. Can't use mod due to decimal 
var avgSeconds = String(avgSeconds); 

//Concat strings. Add the ":" spacers. Where necessary, add leading 0 
var avgStr = (avgHoursStr.length > 1 ? "" : "0") + avgHoursStr + ":" + (avgMinutesStr.length > 1 ? "" : "0") + avgMinuteStr + ":" + avgSecondsStr; 

[編輯 - 感謝PARTH THAKKAR的指出我的問題]

+0

嘿,你的秒也會包含毫秒,以及前一段時間。 –

+0

我知道。我是故意的。這就是爲什麼我使用parseFloat而不是parseInt。我沒有檢查,但我很確定它會工作。雖然我太熟悉javascript如何處理變量聲明。 – acattle

+0

我的代碼確實有問題的,因爲它降低之前零 – acattle