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

Posted

技术标签:

【中文标题】Moment.js - 我如何获得自日期以来的年数,而不是四舍五入?【英文标题】:Moment.js - how do I get the number of years since a date, not rounded up? 【发布时间】:2012-12-13 00:14:03 【问题描述】:

我正在尝试使用Moment.js 计算一个人的年龄,但我发现其他有用的fromNow 方法可以将年份四舍五入。例如,如果今天是 12/27/2012 并且此人的出生日期是 02/26/1978,moment("02/26/1978", "MM/DD/YYYY").fromNow() 返回“35 年前”。如何让 Moment.js 忽略月数,并简单地返回自日期以来的年数(即 34 年)?

【问题讨论】:

【参考方案1】:

使用 moment.js 很简单:

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

更多参考,可以阅读moment.js official documentation。

【讨论】:

如果有人需要浮动年数:var years = moment().diff('1981-01-01', 'years', true); // returns 40.43【参考方案2】:

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);

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

【讨论】:

@ebeltran 的回答涵盖了此技术,您对小数值的讨论与该问题无关。我宁愿将其添加为评论。【参考方案3】:

似乎有一个difference function 接受要使用的时间间隔以及一个对结果进行舍入的选项。所以,像

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

我没有尝试过这个,我对时刻并不完全熟悉,但它似乎应该得到你想要的(无需重置月份)。

【讨论】:

对于这种情况,您似乎不需要从一开始就接收浮点数然后自己四舍五入。看起来 moment 使用 diff 正确舍入了年份计算的结果。 从文档中,从 2.0.0 开始,moment#diff 将返回向下舍入的数字,因此您只需要:age = moment().diff(birthDate, 'years') 【参考方案4】:

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

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

【讨论】:

在 moment.js v2.3.1 中有一个 .fromNow() 方法也很有帮助。【参考方案5】:

此方法简单而强大。

Value 是日期,“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'。

【讨论】:

这篇文章被自动标记为低质量,因为它只是代码。您介意通过添加一些文本来解释它如何解决问题来扩展它吗?【参考方案7】:

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

// 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 以考虑闰年,这对我有用 使用 365.25 是一个近似值,最终可能会让人流泪 - 输入 cal 1752 了解原因【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

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');

【讨论】:

【参考方案10】:

我更喜欢这种小方法。

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;

【讨论】:

正是我想要的! 这里要小心字符串连接。这将认为 11 个月是一年的 0.11,即少于 9 个月 0.9

以上是关于Moment.js - 我如何获得自日期以来的年数,而不是四舍五入?的主要内容,如果未能解决你的问题,请参考以下文章

Moment.js 从日期获取日期名称

Moment js按星期和星期几获取一个月中的特定日期

如何将 Moment.js 日期转换为用户本地时区?

在 Moment Js 中获取两个日期之间的小时差

如何使用 Moment.js 从日期中删除时间?

如何使用 moment.js 获取日期范围