Expand my Community achievements bar.

Radically easy to access on brand approved content for distribution and omnichannel performant delivery. AEM Assets Content Hub and Dynamic Media with OpenAPI capabilities is now GA.
SOLVED

Age in years, months and days

Avatar

Level 4

how can i calculate age in years, months and days in a textfield from a datefield

I tried but failed

plz suggest

1 Accepted Solution

Avatar

Correct answer by
Level 10

Hi,

There's nothing built-in to do this, but you could try this JavaScript

const _MS_PER_DAY = 1000 * 60 * 60 * 24;

const _DAYS_TO_MONTH = 4800 / 146097; // 400 years have 146097 days and 400 years have 4800 months

const _MONTH_TO_DAYS = 146097 / 4800;

var date = util.scand("yyyy-mm-dd", DateOfBirth.rawValue);

var now = new Date();

var days = Math.ceil((now - date) / _MS_PER_DAY);

var monthsFromDays = Math.floor(days * _DAYS_TO_MONTH);

var months = monthsFromDays;

days -= Math.ceil(monthsFromDays * _MONTH_TO_DAYS);

var years = Math.floor(months / 12);

months %= 12;

var result = [];

if (years > 1) result.push(years + " years");

if (years == 1) result.push(years + " year");

if (months > 1) result.push(months + " months");

if (months == 1) result.push(months + " month");

if (days > 1) result.push(days + " days");

if (days == 1) result.push(days + " day");

app.alert(result.join(", "));

My date field is called DateOfBirth and if you want to store the result in a text field you will need to set its .rawValue property instead of the app.alert()

This also assume they haven't entered a date in the future.

Regards

Bruce

View solution in original post

7 Replies

Avatar

Correct answer by
Level 10

Hi,

There's nothing built-in to do this, but you could try this JavaScript

const _MS_PER_DAY = 1000 * 60 * 60 * 24;

const _DAYS_TO_MONTH = 4800 / 146097; // 400 years have 146097 days and 400 years have 4800 months

const _MONTH_TO_DAYS = 146097 / 4800;

var date = util.scand("yyyy-mm-dd", DateOfBirth.rawValue);

var now = new Date();

var days = Math.ceil((now - date) / _MS_PER_DAY);

var monthsFromDays = Math.floor(days * _DAYS_TO_MONTH);

var months = monthsFromDays;

days -= Math.ceil(monthsFromDays * _MONTH_TO_DAYS);

var years = Math.floor(months / 12);

months %= 12;

var result = [];

if (years > 1) result.push(years + " years");

if (years == 1) result.push(years + " year");

if (months > 1) result.push(months + " months");

if (months == 1) result.push(months + " month");

if (days > 1) result.push(days + " days");

if (days == 1) result.push(days + " day");

app.alert(result.join(", "));

My date field is called DateOfBirth and if you want to store the result in a text field you will need to set its .rawValue property instead of the app.alert()

This also assume they haven't entered a date in the future.

Regards

Bruce

Avatar

Level 4

Thanks to help me

it give me result in a pop window

but i want result in Text field.

Avatar

Level 10

If you have a text field object then it would be something like;

TextField1.rawValue = result.join(", ");

If you have a text object then it would be

Text1.value.text.value = result.join(", ");

If you have a text object with rich text content then it would be something like;

var body = <body xmlns="http://www.w3.org/1999/xhtml"
xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">{result.join(", ")}</body>;

Text1.value.exData.loadXML(body.toXMLString(), /* Ignore root node */ false, /* Overwrite content */ true);

Again you will have to change TextField1 or Text1 to suit the names used in your form

Avatar

Level 4

its work like charm

but it don't show correct calculation

when today day < dob day,  today month<dob month, today year< dob year

eg. DOB = 29 oct 2018 and today day = 28/11/2018   Result is 1 month

and same result 1 month  for next date of Oct2018 (30Oct2018,31Oct2018

DOB = 29 dec 2017 and today date = 28/11/2018   Result => 1 year

and same result 1 year  for next date of Dec2017 (30dec2017, 31dec2017)

Avatar

Level 10

I see what you mean, I've edited my answer above with the approach used by the momentJS library.

Avatar

Level 4

Dear BR001

                        Please help me in a another case

i applied this script in a cell of a table that grows using the Button object

but when new row add then in new cell same old result show.