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