import { Observable } from 'rxjs/Observable'; import { Pipe, PipeTransform, ChangeDetectorRef } from '@angular/core'; import { AsyncPipe } from '@angular/common'; @Pipe({ name: 'timeSince', pure: false }) export class TimeSincePipe extends AsyncPipe implements PipeTransform { value: Date; timer: Observable; constructor(ref: ChangeDetectorRef) { super(ref); } transform(value: any): any { if (value instanceof Date) { this.value = value; if (!this.timer) { this.timer = this.getTimer(); } return super.transform(this.timer); } else { throw new Error('TimeSincePipe: Value must be a date'); } } private getTimer() { return Observable .interval(1000) .startWith(0) .map(() => { const now = new Date().getTime(); const delta = (now - this.value.getTime()) / 1000; return delta; }); } }