46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import { Pipe, PipeTransform } from '@angular/core';
|
|
|
|
@Pipe({
|
|
name: 'relativeTime',
|
|
standalone: true,
|
|
pure: false
|
|
})
|
|
export class RelativeTimePipe implements PipeTransform {
|
|
|
|
transform(value: string): string {
|
|
if (!value) {
|
|
return '';
|
|
}
|
|
|
|
const now = new Date();
|
|
const past = new Date(value);
|
|
const elapsed = now.getTime() - past.getTime();
|
|
|
|
const msPerSecond = 1000;
|
|
const msPerMinute = msPerSecond * 60;
|
|
const msPerHour = msPerMinute * 60;
|
|
const msPerDay = msPerHour * 24;
|
|
const msPerWeek = msPerDay * 7;
|
|
const msPerMonth = msPerDay * 30;
|
|
const msPerYear = msPerDay * 365;
|
|
|
|
if (elapsed < msPerSecond) {
|
|
return 'just now';
|
|
} else if (elapsed < msPerMinute) {
|
|
return `${Math.round(elapsed / msPerSecond)} seconds ago`;
|
|
} else if (elapsed < msPerHour) {
|
|
return `${Math.round(elapsed / msPerMinute)} minutes ago`;
|
|
} else if (elapsed < msPerDay) {
|
|
return `${Math.round(elapsed / msPerHour)} hours ago`;
|
|
} else if (elapsed < msPerWeek) {
|
|
return `${Math.round(elapsed / msPerDay)} days ago`;
|
|
} else if (elapsed < msPerMonth) {
|
|
return `${Math.round(elapsed / msPerWeek)} weeks ago`;
|
|
} else if (elapsed < msPerYear) {
|
|
return `${Math.round(elapsed / msPerMonth)} months ago`;
|
|
} else {
|
|
return `${Math.round(elapsed / msPerYear)} years ago`;
|
|
}
|
|
}
|
|
}
|