簡體   English   中英

使用JavaScript平均時間

[英]Averaging Times using Javascript

我正在使用Phonegap和JQuery構建應用程序。

該應用程序(使用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

提前致謝 :)

如果您還將具有毫秒值並且要考慮它們,則將時間轉換為毫秒。 現在,添加它們並將它們除以記錄數。 否則,將所有內容轉換為秒並找到平均值-當然,您可以在幾秒鍾內得到答案。

如果花很少時間考慮一下,轉換就非常簡單。 轉換方法如下。

到毫秒:

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;
}

轉換完成后,將它們加起來並找到平均值。

更新:要轉換回格式為“ 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
}
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

要以毫秒或秒為單位返回答案,請執行以下操作:

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小提琴演示

參考文獻:

我沒有使用Java腳本的豐富經驗,因此我可能會遇到一些語法錯誤,但是我認為您可以做類似的事情

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指出了我的問題]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM