2015-02-08 19 views
21

Ich benutze Angularjs.Angularjs Sekunden zu Zeit Filter

Ich habe Zeichenfolge der Nummer, Beispiel: 237. Es bedeutet Sekunden. Ich brauche es zu ändern: 2:34 oder 3:42:54.

Ich brauche Sekunden zu Zeit Filter. Wie soll ich es machen?

danke.

+3

Vielleicht '237' auf' 2 geändert werden muss: 37'? Warum '3: 42: 54'? Was ist die Logik in der Veränderung? –

+1

237 ist Sekunden. –

+3

Ihre Logik, wie 237 Sekunden zu 2:34 konvertiert werden, ist unklar. 237 Sekunden sind 3 Minuten und 57 Sekunden (60 * 3 + 57 = 237 Sekunden). Wie kommst du zu 2:34? Oder soll 2:34 die Uhrzeit (14:34) sein? Nichts davon macht wirklich Sinn, bis Sie die Logik erklären können, wie Sie 237 Sekunden in 2:34 oder 3:42:54 übersetzen. –

Antwort

68

versuchen, etwas wie folgt aus:

app.filter('secondsToDateTime', [function() { 
    return function(seconds) { 
     return new Date(1970, 0, 1).setSeconds(seconds); 
    }; 
}]) 

html:

<b>{{seconds | secondsToDateTime | date:'HH:mm:ss'}}</b> 

Demo

+0

Einfach und funktioniert! – ilter

+0

brilliant! Vielen Dank! – bobjones

+0

2 Jahre später -> immer noch elegant – dwkd

2

Ich denke, es ist nicht notwendig, das benutzerdefinierte Filter

<b>{{hours}}{{seconds | date:':mm:ss'}}</b> 

function Scoper($scope) { 
    $scope.seconds = '79000'; 
    $scope.hours = parseInt($scope.seconds/3600); 
} 
+2

Der benutzerdefinierte Filter ist möglicherweise nicht notwendig, aber die Sekunde, die Sie diese Logik auf einer anderen Seite benötigen, würde sich die minimale zusätzliche Zeitinvestition, um einen Filter oder eine Richtlinie zu haben, dann auszahlen. Und du könntest dies im Root-Bereich speichern, aber das ist ein weiterer Codesmell, den du ignorieren solltest. – Mattygabe

25

manzapanza ist ein nswer funktioniert nur, wenn die Sekunden weniger als 86400 (1 Tag) sind. Das Datumsobjekt muss vollständig Null sein. Außerdem wäre es besser, das tatsächliche date-Objekt zurückzugeben, so dass anglejs es nicht erneut machen muss.

app.filter('secondsToDateTime', function() { 
    return function(seconds) { 
     var d = new Date(0,0,0,0,0,0,0); 
     d.setSeconds(seconds); 
     return d; 
    }; 
}); 

und

<b>{{seconds | secondsToDateTime | date:'HH:mm:ss'}}</b> 

Edit: Wenn Sie Stunden über 24 gehen wollen, ohne zu Tage Einwickeln es besser ist, nicht Datum zu verwenden:

app.filter('secondsToTime', function() { 

    function padTime(t) { 
     return t < 10 ? "0"+t : t; 
    } 

    return function(_seconds) { 
     if (typeof _seconds !== "number" || _seconds < 0) 
      return "00:00:00"; 

     var hours = Math.floor(_seconds/3600), 
      minutes = Math.floor((_seconds % 3600)/60), 
      seconds = Math.floor(_seconds % 60); 

     return padTime(hours) + ":" + padTime(minutes) + ":" + padTime(seconds); 
    }; 
}); 

und

<b>{{seconds | secondsToTime}}</b> 
+0

für 10 sec eine solche Lösung zeigen 1 Tag 10 sek. – mpz

+0

Was ist "App" hier? in 'app.filter', wo sollten wir den Filter genau setzen? –

+1

@DanyY App ist Ihr Modul: var app = angular.module ('myapp', []); – makman99

0

von @manzapanza Lösung für Tage:

$scope.duration_for = function(seconds){ 
    if(!seconds) return 
    var duration = new Date(1970, 0, 1).setSeconds(seconds) 

    var mask = 'HH:mm' 
    if(seconds >= 86400){ 
     mask = 'd days,' + mask 
    } 

    return $filter('date')(duration, mask); 
    } 

im Blick:

{{duration_for(100500)}} 
5
app.filter('formatTimer', function() { 
return function (input) { 
    function z(n) { return (n < 10 ? '0' : '') + n; } 
    var seconds = input % 60; 
    var minutes = Math.floor(input % 3600/60); 
    var hours = Math.floor(input/3600); 
    return (z(hours) + ':' + z(minutes) + ':' + z(seconds)); 
}; 

AUSGABE: 02:04:14

7

Versuchen Sie folgendes:

app.filter('secondsToHHmmss', function($filter) { 
    return function(seconds) { 
     return $filter('date')(new Date(0, 0, 0).setSeconds(seconds), 'HH:mm:ss'); 
    }; 
}) 

html:

<b>{{seconds | secondsToHHmmss}}</b> 
+0

Ich musste die '[]' fallen lassen, um dies zu machen und Sekunden durch 1000 zu teilen, da ich mit Millisekunden zu tun hatte –

+0

Danke. Gerade überarbeitet. – endru