2016-05-25 6 views
0

Ich benutze jQuery Datatables und ich muss eine Summe einer Zeit (hh: mm: ss) Spalte machen.jQuery Datatables Spalte Summe() von hh: mm: ss

Ich bin hinzufügen Spalte Daten mit sum() Plugin (https://cdn.datatables.net/plug-ins/1.10.11/api/sum%28%29.js), dass ich nicht wirklich verstehe, wie es funktioniert.

 var time_api = this.api(); 
     //total 
     var total = time_api.column(3) 
       .data() 
       .sum();   

     //footer 
     $(time_api.column(3) 
      .footer()) 
      .html(total); 

Das gibt mir diesen Ausgang, der eine Summe ist, aber es braucht einige Optimierungen, und ich kann nicht herausfinden, wie man dieses drehen:

enter image description here

In diesem: 12:03:05 (die korrekte Summenausgabe).

Bitte helfen.

Antwort

1

Wie Sie in plugin source sehen können, konvertiert es zuerst Zeichenfolgeninhalt in eine Zahl und führt dann Addition durch. Sie sollten die Behandlung von Zellwerten erweitern, indem Sie Ihre formatierten Werte HH: MM: SS analysieren (z. B. durch eine Regexp), dann in Zeitintervall in Sekunden umwandeln (HH * 24 + MM * 60 + SS), dann diese Werte summieren, und wandle es dann zurück in Stunden/Minuten/Sekunden.

Sie können sum Funktion wie folgt aktualisiert:

jQuery.fn.dataTable.Api.register('sum()', function () { 
    return this.flatten().reduce(function (a, b) { 

     var timeRegexp = /^(\d{2}):(\d{2}):(\d{2})$/ 

     var matches = a.match(timeRegexp); 
     if (matches) { 
      var hh = matches[1], mm = matches[2], ss = matches[3]; 
      var intervalAsSeconds = hh * 24 + mm * 60 + ss; 
      return b + intervalAsSeconds; 
     } 

     if (typeof a === 'string') { 
      a = a.replace(/[^\d.-]/g, '') * 1; 
     } 
     if (typeof b === 'string') { 
      b = b.replace(/[^\d.-]/g, '') * 1; 
     } 

     return a + b; 
    }, 0); 
}); 

Um Summe in Sekunden zurück in HH zu konvertieren: MM: SS Sie die folgende Funktion verwenden:

function secondsToTime(seconds) { 
    var hours = Math.floor(seconds/3600); 
    var minutes = Math.floor((seconds % 3600)/60); 
    var seconds = Math.floor(seconds % 60); 
    return (hours < 10 ? "0" + hours : hours) + ":" + 
     (minutes < 10 ? "0" + minutes : minutes) + ":" + 
     (seconds < 10 ? "0" + seconds : seconds); 
} 

Einige Beispiele für Rückumwandlung :

console.log(secondsToTime(45)) // 00:00:45 
console.log(secondsToTime(125)) // 00:02:05 
console.log(secondsToTime(3600)) // 01:00:00 
console.log(secondsToTime(3725)) // 01:02:05 
+0

so sagt u die Zahl in 11:62:65 und dann erstellen Formeln aufgeteilt Ausgabe wie 12.03.05 aussehen zu lassen? Hast du ein Code-Snippet, mit dem ich anfangen kann? Vielen Dank! –

+0

Die Antwort wird aktualisiert (Umwandlung der Zellenwerte in Sekunden und zurück zu HH: MM: SS werden hinzugefügt). Dies ist einfach JavaScript, und ich glaube, Sie können auch einige Hilfsfunktionen von moment.js verwenden (da Sie es in Tags erwähnt haben), um Intervalle einfacher zu behandeln. – Alexey

+0

@Alexey Der obige Code wirft den Fehler als TypeError: a.match ist keine Funktion. Irgendeine Lösung? – Steffi

0

Diese Lösung Pranav C Balans 's answer angepasst .

 var time_api= this.api(); 

     var total= tempo.column(3) 
       .data() 
       .sum();    
     total= total.toString();  
     while (total.length < 6){ 
      tempoTotal = "0" + tempoTotal 
     }  

     total= total.replace(/^(\d+)(\d{2})(\d{2})$/, function(m, m1, m2, m3) { 
      m1 = Number(m1); // convert captured group value to number 
      m2 = Number(m2); 
      m2 += parseInt(m3/60, 10); // get minutes from second and add it to minute 
      m3 = m3 % 60; // get soconds 
      m1 += parseInt(m2/60, 10); // get minutes from minute and add it to hour 
      m2 = m2 % 60; // get minutes 
      // add 0 to minute and second if single digit , slice(-2) will select last 2 digit 
      return m1 + ':' + ('0' + m2).slice(-2) + ':' + ('0' + m3).slice(-2); // return updated string 
     }) 

     //write in footer 
     $(tempo.column(3) 
      .footer()) 
      .html(total); 
1
<script type="text/javascript" language="javascript"> 

var table = $('#example').DataTable({ 
"footerCallback": function (row, data, start, end, display) { 
    var api = this.api(), data; 
    // Total over all pages 
    total_ID = api.column(0).data().reduce(function (a, b) { 
     return ~~a + ~~b; 
    }, 0); 
    total_Duration = api.column(1).data().reduce(function (a, b) { 
     return moment.duration(a).asMilliseconds() + moment.duration(b).asMilliseconds(); 
    }, 0); 
    // Total over this page 
    pageTotal_ID = api.column(0, { page: 'current'}).data().reduce(function (a, b) { 
     return ~~a + ~~b; 
    }, 0); 
    pageTotal_Duration = api.column(1, { page: 'current'}).data().reduce(function (a, b) { 
     return moment.duration(a).asMilliseconds() + moment.duration(b).asMilliseconds(); 
    }, 0); 
    // Update footer Column "quantita" 
    $(api.column(0).footer()).html(
     pageTotal_ID + ' ('+ total_ID +' total)' 
    ); 
    $(api.column(1).footer()).html(
     moment.utc(pageTotal_Duration).format("HH:mm:ss") + ' ('+ moment.utc(total_Duration).format("HH:mm:ss") + ' total)' 
    ); 
} 
}); 
</script> 
+0

Können Sie eine Beschreibung hinzufügen? – pableiros