Moment.js-如何获得自日期起的年数,而不是四舍五入?


130

我正在尝试使用Moment.js计算一个人的年龄,但是我发现原本有用的fromNow方法可以将年龄取整。例如,如果今天是2012 moment("02/26/1978", "MM/DD/YYYY").fromNow()年12 月27日,并且该人的生日是1978 年2 月26日,则返回“ 35年前”。如何使Moment.js忽略月份数,而仅返回自该日期以来的年数(即34)?

Answers:


215

使用moment.js很简单:

var years = moment().diff('1981-01-01', 'years');
var days = moment().diff('1981-01-01', 'days');

有关其他参考,您可以阅读moment.js 官方文档


30

http://jsfiddle.net/xR8t5/27/

如果您不希望分数值:

var years = moment().diff('1981-01-01', 'years',false);
alert( years);

如果需要分数值:

var years = moment().diff('1981-01-01', 'years',true);
alert( years);

单位可以是[秒,分钟,小时,天,周,月,年]


3
@ebeltran的答案涵盖了该技术,您对分数值的讨论与该问题无关。我宁愿将其添加为评论。
aknuds1年

21

似乎存在一个差异函数,该函数接受要使用的时间间隔以及不对结果进行四舍五入的选项。所以,像

Math.floor(moment(new Date()).diff(moment("02/26/1978","MM/DD/YYYY"),'years',true)))

我还没有尝试过,而且我对时机还不很熟悉,但是看来这应该可以满足您的要求(不必重置月份)。


对于这种情况,您似乎不需要立即接收浮点数,然后自己对其进行舍入。看起来力矩正确地舍入了使用diff计算年份的结果。
克里斯,

31
从文档开始,从2.0.0版本开始,moment#diff将返回四舍五入的数字,因此您只需要:age = moment().diff(birthDate, 'years')
SuperSkunk

13

我发现将两个日期(提供的日期和现在)都重置为一月是可行的:

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"

3
在moment.js v2.3.1中,有一个.fromNow()方法也可能会有所帮助。
卢卡斯·拉扎罗

9

这种方法既简单又强大。

值是日期,“ DD-MM-YYYY”是日期的掩码。

moment().diff(moment(value, "DD-MM-YYYY"), 'years');

6

试试这个:

 moment("02/26/1978", "MM/DD/YYYY").fromNow().split(" ")[0];

说明:

我们收到如下字符串:'23 days ago'。将其拆分为数组:['23','days','ago'],然后获取第一项'23'。


3
由于仅是代码,因此该帖子被自动标记为低质量。您是否介意通过添加一些文本来解释它如何解决问题来扩展它?
Taifun 2014年

3

这种方法对我有用。它正在检查该人今年是否过生日,否则减去一年。

// date is the moment you're calculating the age of
var now = moment().unix();
var then = date.unix();
var diff = (now - then) / (60 * 60 * 24 * 365);
var years = Math.floor(diff);

编辑:第一个版本不是很完美。更新的应该


如果我将一年中的日期更改为365.25以解决leap年,这对我
很有用

使用365.25是一个近似值,它可能会cal 1752
落下

2

如果您不想使用任何模块进行年龄计算

var age = Math.floor((new Date() - new Date(date_of_birth)) / 1000 / 60 / 60 / 24 / 365.25)

2

当您想显示年份和剩余天数时:

var m = moment(d.birthday.date, "DD.MM.YYYY");
var years = moment().diff(m, 'years', false);
var days = moment().diff(m.add(years, 'years'), 'days', false);
alert(years + ' years, ' + days + ' days');

0

我喜欢这种小方法。

function getAgeFromBirthday(birthday) {
    if(birthday){
      var totalMonths = moment().diff(birthday, 'months');
      var years = parseInt(totalMonths / 12);
      var months = totalMonths % 12;
        if(months !== 0){
           return parseFloat(years + '.' + months);
         }
    return years;
      }
    return null;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.