AngularJS — как вы конвертируете миллисекунды в xHours и yMins

У меня есть требование, когда я хочу преобразовать миллисекунды в xHours и yMins в AngularJS.

Например 3600000 должно отображаться как 1ч 0м.

Я попытался использовать date:'H:m' и date:'HH:mm' из форматов даты на веб-сайте Angular.

Но те дают 19:0 и 19:00 вместо 1ч 0м.

Любые указатели достижения этого будут полезны.

Спасибо


person Pritish    schedule 25.11.2013    source источник
comment
Вы можете написать собственный фильтр. date не для отображения временных интервалов.   -  person akonsu    schedule 25.11.2013


Ответы (8)


Давайте создадим для этого собственный фильтр, например:

.filter('millSecondsToTimeString', function() {
  return function(millseconds) {
    var oneSecond = 1000;
    var oneMinute = oneSecond * 60;
    var oneHour = oneMinute * 60;
    var oneDay = oneHour * 24;

    var seconds = Math.floor((millseconds % oneMinute) / oneSecond);
    var minutes = Math.floor((millseconds % oneHour) / oneMinute);
    var hours = Math.floor((millseconds % oneDay) / oneHour);
    var days = Math.floor(millseconds / oneDay);

    var timeString = '';
    if (days !== 0) {
        timeString += (days !== 1) ? (days + ' days ') : (days + ' day ');
    }
    if (hours !== 0) {
        timeString += (hours !== 1) ? (hours + ' hours ') : (hours + ' hour ');
    }
    if (minutes !== 0) {
        timeString += (minutes !== 1) ? (minutes + ' minutes ') : (minutes + ' minute ');
    }
    if (seconds !== 0 || millseconds < 1000) {
        timeString += (seconds !== 1) ? (seconds + ' seconds ') : (seconds + ' second ');
    }

    return timeString;
};
});

Затем используйте его:

<div>{{ millSeconds | millSecondsToTimeString }}</div>
person haotang    schedule 11.09.2014

В AngularJS есть конвертер даты, просто установите нужный формат даты:

{{milliseconds | date:'yyyy-MM-dd HH:mm'}}

Также я создал такой фильтр timeAgo, используя функцию jQuery timeago():

.filter('timeAgo', function() {
    return function(input) {
        if (input == null) return "";
        return jQuery.timeago(input);
    };
})

Применение:

{{milliseconds | timeAgo}}

или используйте вместе оба формата для широкого представления даты:

<span>{{milliseconds | timeAgo}}, {{milliseconds  | date:'yyyy-MM-dd HH:mm'}}</span>

Результат:

12 minutes ago, 2015-03-04 11:38
person Dmitri Algazin    schedule 04.03.2015

Вы можете использовать объекты длительности моментов.

Чтобы сделать то, что вы хотите, попробуйте следующее:

app.controller 'MainCtrl', ($scope) ->
    $scope.name = 'World'
    $scope.milliseconds = 3600000
    $scope.duration = moment.duration($scope.milliseconds)

И разметка

<body ng-controller="MainCtrl">
  <p>Milliseconds: {{milliseconds}}</p>
  <p>Duration: {{duration.hours()}}h {{duration.minutes()}}m</p>
</body>

plunkr: http://plnkr.co/edit/2HL75Tmr4CoAy5R9smkx

person codevinsky    schedule 25.11.2013

Спасибо. Я немного изменил ваш фильтр, чтобы он возвращал продолжительность в формате чч:мм:сс.

.filter('duration', function() {
    //Returns duration from milliseconds in hh:mm:ss format.
      return function(millseconds) {
        var seconds = Math.floor(millseconds / 1000);
        var h = 3600;
        var m = 60;
        var hours = Math.floor(seconds/h);
        var minutes = Math.floor( (seconds % h)/m );
        var scnds = Math.floor( (seconds % m) );
        var timeString = '';
        if(scnds < 10) scnds = "0"+scnds;
        if(hours < 10) hours = "0"+hours;
        if(minutes < 10) minutes = "0"+minutes;
        timeString = hours +":"+ minutes +":"+scnds;
        return timeString;
    }
});
person Vaughn    schedule 25.04.2015

Для тех, кто хочет использовать запятые-разделители (например, «21 день, 14 часов, 7 минут»):

'use strict';

angular.module('contests').filter('duration', function () {
    return function(milliseconds) {
        var seconds = Math.floor(milliseconds / 1000);
        var days = Math.floor(seconds / 86400);
        var hours = Math.floor((seconds % 86400) / 3600);
        var minutes = Math.floor(((seconds % 86400) % 3600) / 60);
        var dateTimeDurationString = '';
        if ((days > 0) && (hours === 0 && minutes === 0)) dateTimeDurationString += (days > 1) ? (days + ' days ') : (days + ' day ');
        if ((days > 0) && (hours > 0 || minutes > 0)) dateTimeDurationString += (days > 1) ? (days + ' days, ') : (days + ' day, ');
        if ((hours > 0) && (minutes > 0)) dateTimeDurationString += (hours > 1) ? (hours + ' hours, ') : (hours + ' hour, ');
        if ((hours > 0) && (minutes === 0)) dateTimeDurationString += (hours > 1) ? (hours + ' hours ') : (hours + ' hour ');
        if (minutes > 0) dateTimeDurationString += (minutes > 1) ? (minutes + ' minutes ') : (minutes + ' minute ');
        return dateTimeDurationString;
    };
});
person xiaogwu    schedule 23.04.2015

Попробуй это

var app = angular.module ( 'myApp', [] ) ;
app.controller ( 'myController', function ( $scope, $filter) {
    $scope.date = $filter('date')(milliseconds, 'MM/dd/yyyy');
});
person I don't know    schedule 14.05.2016
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Benjamin W.; 14.05.2016

Используйте приведенный ниже синтаксис

$filter('date')(dateObj, format)

e.g.

$filter('date')(1324339200000, 'dd/MM/yyyy');
person Shridhar Sagari    schedule 27.02.2017

Для TypeScript, но может быть адаптирован для любого языка.

convertTimeMS(timeMS: number): string {
  const seconds = Math.floor(timeMS / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);

  let str: string = '';

  if(hours > 0) {
    str = str + hours.toString() + 'h ';
  }
  if(minutes%60 > 0) {
    str = str + Number(minutes%60).toString() + 'm ';
  }
  if(seconds%60 > 0) {
    str = str + Number(seconds%60).toString() + 's ';
  }

  return str;
}
person Brad Bullard    schedule 24.11.2019