2013-08-25 6 views
2

Donc, j'ai ce serveur web qui analyse un fichier XML avec un certain 'time-period'.Analyser les chaînes de temps en Javascript

le délai est présenté comme suit (je ne peux pas changer cela):

00:05:00 00:09:15 01:13:15 dans un format HH:MM:SS.

Je veux faire une _.filter() sélectionner sur tous les objets ayant une date entre par exemple 00:00:00 et 00:10:00, puis un filtre avec tous les objets entre 00:10:00 et 00:20:00. EDIT (clarification): Avec les périodes de temps sont «fois regardé». Disons qu'il ya 50 entrées de la période, allant de 00:00:00 à 1:30:00, mais je veux faire une nouvelle liste qui contient

  • La période
  • La moyenne ' fois regardé 'dans cette période de temps.

Cela signifie que j'ai besoin d'un moyen de dire: 'Sélectionnez toutes les périodes entre zéro minute et 10 minutes. Donnez-moi une liste de ceux-ci. Calculer la moyenne '.

Pour cela, je aurais besoin d'avoir une possibilité de faire des opérations arithmétiques, puisque je voudrais

  • Comparez les dates
  • Ajouter 10 minutes à chaque itération

Cependant, la Javascript Date objet ne semble pas gérer «juste des moments» ainsi que la bibliothèque moment.js. Comment j'irais pour ça?

+0

Pourriez-vous clarifier ce que vous voulez dire dans votre 4ème paragraphe (filtre)? Je prends ce que vous voulez exécuter '_.filter()' deux fois, une fois la vérification de 00: 00: 00' à 00: 10: 00', et la seconde '00: 10: 00' à' 00 : 20: 00 » Aussi, à propos de "Ajouter 10 minutes à chaque itération", est-ce que c'est pour tous dans le filtre, ou dans le filtre? –

+1

J'ai ajouté quelques précisions! –

+1

duplication possible de [Convertir HH: MM: SS en secondes seulement en javascript] (http://stackoverflow.com/questions/9640266/convert-hhmmss-string-to-seconds-only-in-javascript) – WiredPrairie

Répondre

-1

La manière la plus simple serait pour vous de tout convertir en secondes, puis faites votre chose.

inSeconds = function(time) { 
    var secs, arr = []; 
    arr = time.split(':').map(function(item) { return parseInt(item) }); 
    secs = arr[0]*3600 + arr[1]*60 + arr[2]; 
    return secs; 
} 
+0

tester cela? – user568109

+0

Oh mon dieu, je n'avais pas converti la chaîne en int. –

0

Voici comment je ferais dans JS:

times=['00:05:00', '00:09:15', '01:13:15']; 
  1. D'abord obtenir secondes

    function getsec(time){ 
        arr=time.split(':'); 
        return (+arr[0])*3600 + (+arr[1])*60 + (+arr[2]); 
    } 
    
    times.map(getsec) 
    [ 300, 555, 4395 ] 
    
  2. Puis filtrer fois dans les fentes de période donnée

    function filter(last, curr, index, array){ 
        chk=parseInt(curr/600); //slots for 10 minutes 
        if (typeof last[chk] === 'undefined') 
        { 
        last[chk]=[]; 
        last[chk].push(curr); 
        } 
        else 
        last[chk].push(curr); 
        return(last) 
    } 
    
    times.map(getsec).reduce(filter,[]); 
    [ [ 300, 555 ], , , , , , , [ 4395 ] ] 
    

    Retourne un tableau de tableaux. Chaque tableau d'enfant contient temps dans les fentes dans l'ordre croissant

  3. Calculer signifie

    function avg(last, curr, index, array){ 
        if(index==array.length-1) 
        return (last+curr)/array.length; 
        else 
        return last+curr; 
    } 
    
    times.map(getsec).reduce(avg,0); 
    1750 
    
    function getavg(arr){ 
        return arr.reduce(avg,0); 
    } 
    
    times.map(getsec).reduce(filter,[]).map(getavg); 
    [ 427.5, , , , , , , 4395 ] 
    

    Puisque nous traitons avec tableau de tableaux dont nous avons besoin d'une enveloppe.

Enfin, je dirais que si vous avez beaucoup d'entrées, les bases de données seraient plus rapides.

Questions connexes