Snippet for a rather popular requirement. Formatting a date in a nice way, using infamous "time ago" function. This is the basic version which I adapt to fit a specific project. To keep it easily customizable to your needs, I haven't packaged it up.
Just pass a date to it, and function will return one of the seven possible formats:
now
- if no more than five seconds elapsedabout a minute ago
- in no more than ninety seconds elapsed24 minutes ago
- for anything in the last hourToday at 11:19
- for todayYesterday at 7:32
- for yesterday15. February at 17:45
- for dates in the current year23. October 2017. at 0:59
- for anything else
Feel free to play with it and add more cases if you need them.
Code
const MONTH_NAMES = [
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
];
function getFormattedDate(date, prefomattedDate = false, hideYear = false) {
const day = date.getDate();
const month = MONTH_NAMES[date.getMonth()];
const year = date.getFullYear();
const hours = date.getHours();
let minutes = date.getMinutes();
if (minutes < 10) {
minutes = `0${ minutes }`;
}
if (prefomattedDate) {
return `${ prefomattedDate } at ${ hours }:${ minutes }`;
}
if (hideYear) {
return `${ day }. ${ month } at ${ hours }:${ minutes }`;
}
return `${ day }. ${ month } ${ year }. at ${ hours }:${ minutes }`;
}
function timeAgo(dateParam) {
if (!dateParam) {
return null;
}
const date = typeof dateParam === 'object' ? dateParam : new Date(dateParam);
const DAY_IN_MS = 86400000;
const today = new Date();
const yesterday = new Date(today - DAY_IN_MS);
const seconds = Math.round((today - date) / 1000);
const minutes = Math.round(seconds / 60);
const isToday = today.toDateString() === date.toDateString();
const isYesterday = yesterday.toDateString() === date.toDateString();
const isThisYear = today.getFullYear() === date.getFullYear();
if (seconds < 5) {
return 'now';
} else if (seconds < 60) {
return `${ seconds } seconds ago`;
} else if (seconds < 90) {
return 'about a minute ago';
} else if (minutes < 60) {
return `${ minutes } minutes ago`;
} else if (isToday) {
return getFormattedDate(date, 'Today');
} else if (isYesterday) {
return getFormattedDate(date, 'Yesterday');
} else if (isThisYear) {
return getFormattedDate(date, false, true);
}
return getFormattedDate(date);
}
Demo
Update, August 2020
Comments (8)