173

I'm trying to calculate a person's age using Moment.js, but I'm finding that the otherwise useful fromNow method rounds up the years. For instance, if today is 12/27/2012 and the person's birth date is 02/26/1978, moment("02/26/1978", "MM/DD/YYYY").fromNow() returns '35 years ago'. How can I make Moment.js ignore the number of months, and simply return the number of years (i.e. 34) since the date?

aknuds1
  • 65,625
  • 67
  • 195
  • 317

13 Answers13

305

Using moment.js is as easy as:

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

For additional reference, you can read moment.js official documentation.

Ivan
  • 34,531
  • 8
  • 55
  • 100
Edwin Beltran
  • 4,419
  • 4
  • 20
  • 16
  • 3
    If someone needs the number of years in float: `var years = moment().diff('1981-01-01', 'years', true); // returns 40.43` – Skoua May 06 '21 at 21:14
48

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

if you do not want fraction values:

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

if you want fraction values:

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

Units can be [seconds, minutes, hours, days, weeks, months, years]

Razan Paul
  • 13,618
  • 3
  • 69
  • 61
  • 4
    This technique is covered by @ebeltran's answer, and your discussion of fractional values has nothing to do with the question. I'd rather add it as a comment. – aknuds1 Dec 29 '16 at 19:05
24

There appears to be a difference function that accepts time intervals to use as well as an option to not round the result. So, something like

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

I haven't tried this, and I'm not completely familiar with moment, but it seems like this should get what you want (without having to reset the month).

user4815162342
  • 2,058
  • 3
  • 18
  • 23
  • It appears you do not need to receive the floating point number from moment and then round it yourself, for this scenario. It looks like moment is correctly rounding the result for the year calculation using diff. – chris May 10 '13 at 23:50
  • 34
    From the docs, since 2.0.0, moment#diff will return number rounded down, so you only need to : ```age = moment().diff(birthDate, 'years') ```. – SuperSkunk May 28 '13 at 21:47
17

This method is easy and powerful.

Value is a date and "DD-MM-YYYY" is the mask of the date.

moment().diff(moment(value, "DD-MM-YYYY"), 'years');
aknuds1
  • 65,625
  • 67
  • 195
  • 317
user2327748
  • 179
  • 1
  • 3
14

I found that it would work to reset the month to January for both dates (the provided date and the present):

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"
aknuds1
  • 65,625
  • 67
  • 195
  • 317
8

Try this:

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

Explanation:

We receive string something like this: '23 days ago'. Split it to array: ['23', 'days', 'ago'] and then take first item '23'.

Fyodor Khruschov
  • 1,657
  • 7
  • 23
  • 40
  • 3
    This post is being automatically flagged as low quality because it is only code. Would you mind expanding it by adding some text to explain how it solves the problem? – Taifun Jun 12 '14 at 16:30
4

This method works for me. It's checking if the person has had their birthday this year and subtracts one year otherwise.

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

Edit: First version didn't quite work perfectly. The updated one should

2

If you dont want to use any module for age calculation

var age = Math.floor((new Date() - new Date(date_of_birth)) / 1000 / 60 / 60 / 24 / 365.25)
Ankit
  • 520
  • 7
  • 21
1

When you want to show years and the remaining days:

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');
Xdg
  • 1,735
  • 2
  • 27
  • 42
1

Get years and days using moment.js library

import moment from 'moment'

export function getAge(dateString: string) {
  const date = moment(dateString, 'YYYY-MM-DD')
  const years = moment().diff(date, 'years')
  const days = moment().diff(date.add(years, 'years'), 'days', false)
  return { years, days }
}

const birthDate = "1997-04-01T00:00:00.000Z";
const age = getAge(birthDate);

// Today is 2022-04-09
console.log({ age })
// Result: { age: { years: 25, days: 8 } }
Emanuel
  • 2,603
  • 22
  • 24
1

You can try this:

moment
.duration({
  years: moment(Date.now()).diff(datetime, "years", false),
})
.humanize()
Chris Bao
  • 2,418
  • 8
  • 35
  • 62
0

I prefer this small method.

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;
}
Dagan Bog-Computers
  • 598
  • 1
  • 5
  • 16
0

Here is the simple one using moment.js

let dt = dob;

        let age = '';

        let bY = Number(moment(dt).format('YYYY')); 
        let bM = Number(moment(dt).format('MM')); 
        let bD = Number(moment(dt).format('DD')); 

        let tY = Number(moment().format('YYYY')); 
        let tM = Number(moment().format('MM')); 
        let tD = Number(moment().format('DD')); 


        age += (tY - bY) + ' Y ';

        if (tM < bM) {
            age += (tM - bM + 12) + ' M ';
            tY = tY - 1;
        } else {
            age += (tM - bM) + ' M '
        }

        if (tD < bD) {
            age += (tD - bD + 30) + ' D ';
            tM = tM - 1;
        } else {
            age += (tD - bD) + ' D '
        }
        
        //AGE MONTH DAYS
        console.log(age);
Muhammad Ibrahim
  • 507
  • 9
  • 19