繁体   English   中英

使用过滤器以自定义格式设置日期格式

[英]Use filters to format date in a custom format

我正在尝试在我的角度应用程序上以自定义格式显示一些日期:我想看到“ 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;
    }

}

我如何仅使用过滤器就能做到这一点?

谢谢

您是否在寻找基本的角度过滤器模板? 这就是用角度过滤器包装代码的方式。

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

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

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

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

});

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

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

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

使用Moment.js ,这很简单:

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

CDNJS上的Moment.js

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

用法就像@Josh提到的那样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM