【问题标题】:Use filters to format date in a custom format使用过滤器以自定义格式格式化日期
【发布时间】:2014-03-14 15:35:27
【问题描述】:

我正在尝试在我的 Angular 应用程序上显示一些具有自定义格式的日期:我希望看到“1 小时前”、“2 天前”......而不是实际时间,所以我正在考虑使用过滤器来做到这一点。

我的日期存储在 MongoDb 中,因此我将它们作为 ISODate 接收:

ISODate("2014-03-13T10:48:02.991Z")

基本上我想将此函数应用于我的日期:

function timeSince(ts){
    now = new Date();
    ts = new Date(ts*1000);
    var delta = now.getTime() - ts.toString().getTime();

    delta = delta/1000; //us to s

    var ps, pm, ph, pd, min, hou, sec, days;

    if(delta<=59){
        ps = (delta>1) ? "s": "";
        return delta+" second"+ps
    }

    if(delta>=60 && delta<=3599){
        min = Math.floor(delta/60);
        sec = delta-(min*60);
        pm = (min>1) ? "s": "";
        ps = (sec>1) ? "s": "";
        return min+" minute"+pm+" "+sec+" second"+ps;
    }

    if(delta>=3600 && delta<=86399){
        hou = Math.floor(delta/3600);
        min = Math.floor((delta-(hou*3600))/60);
        ph = (hou>1) ? "s": "";
        pm = (min>1) ? "s": "";
        return hou+" hour"+ph+" "+min+" minute"+pm;
    } 

    if(delta>=86400){
        days = Math.floor(delta/86400);
        hou =  Math.floor((delta-(days*86400))/60/60);
        pd = (days>1) ? "s": "";
        ph = (hou>1) ? "s": "";
        return days+" day"+pd+" "+hou+" hour"+ph;
    }

}

我怎样才能简单地使用过滤器来做到这一点?

谢谢

【问题讨论】:

标签: javascript angularjs mongodb date


【解决方案1】:

您只需要创建一个返回该函数的filter

myModule.filter('prettyTime', function(){

   return function(ts){
      //Your code here
   };

});

假设您的 $scope 某处有一些 Date 对象:

<span>{{time | prettyTime}}</span>

这是一个工作演示:http://jsfiddle.net/jwcarroll/ARc65/

【讨论】:

    【解决方案2】:

    您在寻找基本的角度滤镜模板吗? 这就是你应该如何用角度过滤器包装你的代码。

    angular.module('MyModule', []).
      filter('timeSince', function() {
        return function(input) {
    
        var now = new Date();
        var ts = new Date(input);
        var delta = now.getTime() - ts.toString().getTime();
    
        delta = delta/1000; //us to s
    
        var ps, pm, ph, pd, min, hou, sec, days;
    
        if(delta<=59){
            ps = (delta>1) ? "s": "";
            return delta+" second"+ps
        }
    
        if(delta>=60 && delta<=3599){
            min = Math.floor(delta/60);
            sec = delta-(min*60);
            pm = (min>1) ? "s": "";
            ps = (sec>1) ? "s": "";
            return min+" minute"+pm+" "+sec+" second"+ps;
        }
    
        if(delta>=3600 && delta<=86399){
            hou = Math.floor(delta/3600);
            min = Math.floor((delta-(hou*3600))/60);
            ph = (hou>1) ? "s": "";
            pm = (min>1) ? "s": "";
            return hou+" hour"+ph+" "+min+" minute"+pm;
        } 
    
        if(delta>=86400){
            days = Math.floor(delta/86400);
            hou =  Math.floor((delta-(days*86400))/60/60);
            pd = (days>1) ? "s": "";
            ph = (hou>1) ? "s": "";
            return days+" day"+pd+" "+hou+" hour"+ph;
        }
    
        return "-";
        };
      });
    

    在标记中使用:时间自:{{this_should_be_the_ISODate_from_model | timeSince}}

    【讨论】:

      【解决方案3】:

      使用Moment.js,这很简单:

      App.filter('ago', function(){
        return function(epoch){
          var diff = Date.now() - parseInt(epoch,10);
          return moment.duration(diff).humanize() + ' ago';
        };
      });
      

      Moment.js on CDNJS

      编辑:Moment 还将解析各种 ISO 类型,请参阅文档

      用法如@Josh 所述:

      <span>{{ time | ago }}</span>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        相关资源
        最近更新 更多