Listing of FormatAge.js
//------------------------------------------------------------------ // formatAge: format the age as a text string // ageFormat: // 0 years, months, and days // 1 months and days // 2 days only //------------------------------------------------------------------ var monthDays = new Array (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); function formatAge(name, birthdate, ageFormat) { var date1 = new Date(birthdate); var result = name + " is " + formatDelta(date1, "", ageFormat) + " old."; return result; } //------------------------------------------------------------------ // formatDelta: figures the difference from d1 to d2 = "mm/dd/yyyy" // if either date is blank, use today //------------------------------------------------------------------ function formatDelta(d1, d2, ageFormat) { //-------------------------------------------------------------- // compute today - birthday //-------------------------------------------------------------- var date1, date2; if (d1 == "") date1 = new Date(); else date1 = new Date(d1); if (d2 == "") date2 = new Date(); else date2 = new Date(d2); //-------------------------------------------------------------- // swap order if necessary //-------------------------------------------------------------- if (date2 < date1) { var datex = date1; date1 = date2; date2 = datex; } var deltaY = date2.getFullYear() - date1.getFullYear(); var deltaM = date2.getMonth() - date1.getMonth(); var deltaD = date2.getDate() - date1.getDate(); //-------------------------------------------------------------- // if the day difference is negative, adjust M and D //-------------------------------------------------------------- if (deltaD < 0) { var iPrev = date2.getMonth() - 1 ; // previous month if (iPrev == -1) iPrev = 11; // January - 1 = December deltaD = date2.getDate() + monthDays[iPrev] - date1.getDate(); //---------------------------------------------------------- // adjust for leap years //---------------------------------------------------------- if (iPrev == 1 && isLeapYear(date2)) deltaD ++; deltaM --; } //-------------------------------------------------------------- // similar fix for month difference negative //-------------------------------------------------------------- if (deltaM < 0) { deltaY --; deltaM += 12; } //-------------------------------------------------------------- // format the age text (ymd is the default). //-------------------------------------------------------------- var result = ""; if (ageFormat == 0 && deltaY == 0) ageFormat = 1; if (ageFormat == 1 && deltaM == 0) ageFormat = 2; switch (ageFormat) { case 1: deltaM += 12 * deltaY; result = formatPlural(deltaM, "month") + " and " + formatPlural(deltaD, "day"); break; case 2: // all days is the hard case result = formatPlural(dayOfEra(date2) - dayOfEra(date1), "day"); break; default: result = formatPlural(deltaY, "year") + ", " + formatPlural(deltaM, "month") + ", and " + formatPlural(deltaD, "day"); break; } return result; } //------------------------------------------------------------------ // formatPlural: add number to word, possibly add s //------------------------------------------------------------------ function formatPlural(n, word) { var result = n + " " + word; if (n != 1) result += "s"; return result; } //------------------------------------------------------------------ // dayOfEra: number of days from 1/1/0 to 1/1/yyyy //------------------------------------------------------------------ function dayOfEra(date) { //-------------------------------------------------------------- // first get number of days from 1/1/0 to 1/1/yyyy //-------------------------------------------------------------- var y = date.getFullYear() - 1; // history var n = 365 * y + Math.floor(y / 4) - Math.floor(y / 400); //-------------------------------------------------------------- // Then add up the days for the current year //-------------------------------------------------------------- n += date.getDate(); for (var i=0; i<date.getMonth(); i++) { n += monthDays[i]; if (i == 1 && isLeapYear(date)) n++; } return n; } //------------------------------------------------------------------ // Is the given year a leap year? //------------------------------------------------------------------ function isLeapYear(date) { var result = false; if (date.getFullYear() % 4 == 0 && date.getFullYear() % 400 != 0 ) result = true; return result; }