在AngularJS中将生日转换为年龄

10

我想在网格中显示所有用户的年龄。我正在从Facebook读取数据,没有将其存储在任何地方。

我显示的日期格式如下:

{{ friend.birthday }}

如何显示年龄而不是生日。

如果可以创建筛选器,则如何创建筛选器以及如何应用它。

4个回答

35

您可以实现一个函数:

控制器:

$scope.calculateAge = function calculateAge(birthday) { // birthday is a date
    var ageDifMs = Date.now() - birthday.getTime();
    var ageDate = new Date(ageDifMs); // miliseconds from epoch
    return Math.abs(ageDate.getUTCFullYear() - 1970);
}

HTML

{{ calculateAge(friend.birthday) }}

或者一个过滤器:

app.filter('ageFilter', function() {
     function calculateAge(birthday) { // birthday is a date
         var ageDifMs = Date.now() - birthday.getTime();
         var ageDate = new Date(ageDifMs); // miliseconds from epoch
         return Math.abs(ageDate.getUTCFullYear() - 1970);
     }

     return function(birthdate) { 
           return calculateAge(birthdate);
     }; 
});

HTML

{{ friend.birthday | ageFilter }}

年龄算法取自于这个SO答案

[编辑] 如果年龄小于1岁,并且你想显示月份,你可以修改ageFilter计算月份差异:

app.filter('ageFilter', function() {
     function calculateAge(birthday) { // birthday is a date
         var ageDifMs = Date.now() - birthday.getTime();
         var ageDate = new Date(ageDifMs); // miliseconds from epoch
         return Math.abs(ageDate.getUTCFullYear() - 1970);
     }
     function monthDiff(d1, d2) {
       if (d1 < d2){
        var months = d2.getMonth() - d1.getMonth();
        return months <= 0 ? 0 : months;
       }
       return 0;
     }       
     return function(birthdate) { 
           var age = calculateAge(birthdate);
           if (age == 0)
             return monthDiff(birthdate, new Date()) + ' months';
           return age;
     }; 
});

年龄函数演示
年龄筛选器演示
筛选年龄小于1年的月份的演示


这个很好用。感谢这个解决方案。然而,对于婴儿年龄小于1岁的情况,如何修改它以显示月份,例如“6个月”,而非将年龄显示为“0”? - Neel
这个解决方案在某些情况下不起作用。对于2015年1月1日生日,在2016年1月26日(日.月.年)输出0岁。 - mitjap
1
它是有效的...月份从索引0开始。因此,月份0是一月,月份1是二月。你有没有犯认为1是一月的错误? - pixelbits
@pixelbits - 你好,我需要你的帮助,我们可以联系吗? - Aravind
我能帮您什么? - pixelbits
显示剩余2条评论

4
如果您的值只是例如“05/01/2016”,那么这段代码将会是一个将日期转换为生日的有用工具。
AngularJS
app.filter('ageFilter', function(){
    return function(birthday){
        var birthday = new Date(birthday);
        var today = new Date();
        var age = ((today - birthday) / (31557600000));
        var age = Math.floor( age );
        return age;
    }
});

HTML

{{ relationTypePreDefined.birthdate | ageFilter }}

顺便说一下,我使用了这个解决方案将来自jquery日期选择器输入的日期转换为年龄。


1
如果您正在使用momentjs,那么您可以使用以下代码片段来创建过滤器。
var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

1

我不知道为什么我无法回复别人,显示我需要更多的声望,但是要获得声望,我需要发表评论...无论如何。

针对@Dean Christian Armada的回复,我一直收到有关筛选器的错误。但是更改为以下内容似乎可以正常工作,所以我非常感激!

$scope.getAge = function(birthday){
    var birthday = new Date(birthday);
    var today = new Date();
    var age = ((today - birthday) / (31557600000));
    var age = Math.floor( age );
    return age;
  }

"对于HTML"
{{ getAge(birthdate) }}

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