Angular.js:将秒转换为HH:mm:ss过滤器

26

我有一个秒数计数,比如713秒。如何实现一个Angular.js过滤器,将这个713秒转换为HH:mm:ss格式?在这种情况下,应该是00:11:53。

<div>
  {{ 713 | secondsToHHMMSS }} <!-- Should output 00:11:53 -->
</div>
6个回答

77

试试这样做:

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

HTML:

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

演示


2
两年后 -> 依然优雅 - dwkd
1
时间在互联网上并不重要。这个答案对我很有帮助。谢谢。 - Max

34

如果秒数小于86400(1天),manzapanza的答案才有效。日期对象需要完全为零。此外,最好返回实际的日期对象,这样angularjs就不必再次创建它。

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

并且

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

编辑:如果您希望小时数超过24而不会转换为天数,最好不要使用Date:

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

并且

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

这里的“app”是什么?在app.filter中,我们应该把过滤器放在哪里? - Dany Y
1
@DanyY 应用程序是你的模块:var app = angular.module('myapp', []); - makman99

8

试试这个:

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>

我需要去掉 [ ] 才能使其正常工作,并将秒数除以 1000,因为我正在处理毫秒。 - Simon H
谢谢。刚刚修改了。 - endru

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

将输出:02:04:14

2

我认为自定义过滤器并非必要

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

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

2
自定义过滤器可能不是必需的,但是如果您需要在另一页上使用此逻辑,则最小的额外时间投资来拥有一个过滤器或指令将会得到回报。您可以将其存储在根范围上,但这是另一个应该忽略的代码味道。 - Mattygabe

0

由@manzapanza提供的解决方案:

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

在视图中:

{{duration_for(100500)}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接