【问题标题】:Averaging Times using Javascript使用 Javascript 平均时间
【发布时间】:2012-05-06 10:40:56
【问题描述】:

我正在使用 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

提前致谢:)

【问题讨论】:

    标签: javascript jquery cordova timer average


    【解决方案1】:
    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

    【讨论】:

    • @Deano 你可以查看这个答案
    • 我同意,将我的功能换成这个提供的解决方案,更不用说“工作”了:D
    【解决方案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;
    }
    

    转换完成后,将它们相加并求平均值。

    更新: 为了转换回“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
    }
    

    【讨论】:

    • 如果我想转换平均毫秒结果以匹配我一直使用的格式 [HH:MM:SS.mm] ?
    • 平均返回结果为:2059 chunkify 函数返回 2012-05-06 12:26:34.395 THEAPP[2341:707] [INFO] Object: HH = 0 MM = 0 SS = 0 mm = 0
    • 嘿抱歉!没有添加任何分隔符。我就这么做。再次抱歉:)
    • 自己整理了最后一位..不过这个回复很全面,谢谢!
    • 好吧,嘿——我知道你已经把它整理好了,但是当你这样做的时候,我正在处理错误——这真的很愚蠢——最后,我找到了一个傻瓜证明您的问题的解决方案并对其进行了测试。这是小提琴jsfiddle.net/5tEd6。不要使用它,没关系 - 但只需检查我投入的努力。 :)
    【解决方案3】:

    我对 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 指出我的问题]

    【讨论】:

    • 嘿,你的秒数也包含毫秒,以及前一个时间段。
    • 我知道。我是故意的。这就是我使用 parseFloat 而不是 parseInt 的原因。我还没有检查过,但我很确定它会起作用。虽然我对javascript如何处理变量声明太熟悉了。
    【解决方案4】:

    以毫秒或秒为单位返回答案:

    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.

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多