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?

- 65,625
- 67
- 195
- 317
13 Answers
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.

- 34,531
- 8
- 55
- 100

- 4,419
- 4
- 20
- 16
-
3If 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
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]

- 13,618
- 3
- 69
- 61
-
4This 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
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).

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

- 65,625
- 67
- 195
- 317

- 179
- 1
- 3
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"

- 65,625
- 67
- 195
- 317
-
3In moment.js v2.3.1 there is a .fromNow() method which can also be helpful. – Lucas Lazaro Oct 25 '13 at 23:17
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'.

- 1,657
- 7
- 23
- 40
-
3This 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
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

- 61
- 4
-
This worked for me if i changed the days of the year to 365.25 to account for leap years – bschipp Nov 18 '14 at 05:24
-
using 365.25 is an approximation that can end up in tears - type ```cal 1752``` to see why – pgee70 Nov 18 '19 at 04:52
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)

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

- 1,735
- 2
- 27
- 42
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 } }

- 2,603
- 22
- 24
You can try this:
moment
.duration({
years: moment(Date.now()).diff(datetime, "years", false),
})
.humanize()

- 2,418
- 8
- 35
- 62

- 11
- 1
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;
}

- 598
- 1
- 5
- 16
-
-
Be careful with string concatenation here. This will consider 11 months to be .11 of a year, i.e. Less than 9 months .9 – Phil Aug 07 '21 at 11:33
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);

- 507
- 9
- 19