Javascript Friendly Date and Time

I recently had a requirement in javascript to translate a date and time into something more friendly, so that for example 10th January 2014 10:45 becomes “Yesterday 10:45”, or 12:15 today becomes “2 hours ago”. After scanning the various solutions I could find, I came up with the following:

  • < 5 minutes: now
  • < 1 hour: xx minutes ago
  • today: today hh:mm
  • yesterday: yesterday hh:mm
  • < 7 days: day-of-week hh:mm
  • this year: month day
  • default: month day year
function friendlyDate(dateValue) {
// < 5 mins   : now
// < 1 hour   : xx minutes ago
// today      : today hh:mm
// yesterday  : yesterday hh:mm
// < 7 days   : day of week hh:mm
// this year  : month + day
// default    : month + day + year
var dateparts = dateValue.toUTCString().split(' '); // Thu May 29 2014 10:09:32 GMT+0000 (GMT)
var weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var now = new Date();

var diffMsec = now.getTime() - dateValue.getTime();
var diffMins = Math.round(diffMsec / 60000);

if (diffMins < 1) {
return "now";
} else if (diffMins === 1) {
return "1 minute ago";
} else if (diffMins < 60) {
return diffMins + " minutes ago";
}

// ignore time component
var testDate = new Date(dateValue);
testDate.setHours(0, 0, 0, 0);
now.setHours(0, 0, 0, 0);
var mSecPerDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
var diffDays = Math.round(Math.abs((now.getTime() - testDate.getTime()) / (mSecPerDay)));

if (diffDays === 0) {
return "today " + dateparts[4].substr(0, 5);
} else if (diffDays === 1) {
return "yesterday " + dateparts[4].substr(0, 5);
} else if (diffDays < 7) {
return weekdays[dateValue.getDay()] + ' ' + dateparts[4].substr(0, 5);
}

if (dateValue.getFullYear() === now.getFullYear()) {
return dateparts[1] + ' ' + dateparts[2];
}

return dateparts[1] + ' ' + dateparts[2] + ', ' + dateparts[3];
}

You can try this out on jsfiddle