diff --git a/src/app/modules/shared/pipes/substract-date/substract-date.pipe.spec.ts b/src/app/modules/shared/pipes/substract-date/substract-date.pipe.spec.ts index b2db647e2..4b91ccb37 100644 --- a/src/app/modules/shared/pipes/substract-date/substract-date.pipe.spec.ts +++ b/src/app/modules/shared/pipes/substract-date/substract-date.pipe.spec.ts @@ -7,12 +7,21 @@ describe('SubstractDatePipe', () => { }); it('returns the date diff using hh:mm', () => { - const fromDate = new Date('2011-04-11T10:20:40Z'); - const substractDate = new Date('2011-04-11T08:00:30Z'); - - const diff = new SubstractDatePipe().transform(fromDate, substractDate); - - expect(diff).toBe('02:20'); + [ + { endDate: '2021-04-11T10:20:00Z', startDate: '2021-04-11T08:00:00Z', expectedDiff: '02:20' }, + { endDate: '2021-04-11T17:40:00Z', startDate: '2021-04-11T17:10:00Z', expectedDiff: '00:30' }, + { endDate: '2021-04-11T18:18:00Z', startDate: '2021-04-11T18:00:00Z', expectedDiff: '00:18' }, + { endDate: '2021-04-12T12:18:00Z', startDate: '2021-04-11T10:00:00Z', expectedDiff: '26:18' }, + { endDate: '2021-04-12T10:01:00Z', startDate: '2021-04-12T10:00:00Z', expectedDiff: '00:01' }, + { endDate: '2021-04-11T11:27:00Z', startDate: '2021-04-11T10:03:45Z', expectedDiff: '01:24' }, + ].forEach(({ startDate, endDate, expectedDiff }) => { + const fromDate = new Date(endDate); + const substractDate = new Date(startDate); + + const diff = new SubstractDatePipe().transform(fromDate, substractDate); + + expect(diff).toBe(expectedDiff); + }); }); it('returns the date diff using hh:mm:ss for a diff < 1 min when displaySeconds is true', () => { @@ -43,8 +52,8 @@ describe('SubstractDatePipe', () => { }); it('returns --:-- if substractDate is null', () => { - const substractDate = null; const fromDate = new Date('2011-04-11T08:00:30Z'); + const substractDate = null; const diff = new SubstractDatePipe().transform(fromDate, substractDate); diff --git a/src/app/modules/shared/pipes/substract-date/substract-date.pipe.ts b/src/app/modules/shared/pipes/substract-date/substract-date.pipe.ts index 3bec888d0..3bbaf1466 100644 --- a/src/app/modules/shared/pipes/substract-date/substract-date.pipe.ts +++ b/src/app/modules/shared/pipes/substract-date/substract-date.pipe.ts @@ -1,7 +1,6 @@ import { NumberFormatter } from './../../formatters/number.formatter'; import { Pipe, PipeTransform } from '@angular/core'; import * as moment from 'moment'; -import { DATE_FORMAT_YEAR } from 'src/environments/environment'; @Pipe({ name: 'substractDate' }) @@ -9,25 +8,37 @@ export class SubstractDatePipe implements PipeTransform { transform(fromDate: Date, substractDate: Date, displaySeconds: boolean = false): string { - if (fromDate === null || substractDate === null ) { + if (fromDate === null || substractDate === null) { return '--:--'; } - const startDate = moment(substractDate, `${DATE_FORMAT_YEAR} HH:mm:ss`); - let endDate = moment(fromDate, `${DATE_FORMAT_YEAR} HH:mm:ss`); - let duration: moment.Duration = moment.duration(endDate.diff(startDate)); + const startDate = moment(substractDate); + const endDate = moment(fromDate); + let duration = this.getTimeDifference(startDate, endDate); + const lessThanMinute = duration.asSeconds() < 60 || displaySeconds; - if (duration.asSeconds() > 60 && !displaySeconds) { - endDate = endDate.add(1, 'minute').startOf('minute'); - duration = moment.duration(endDate.diff(startDate)); - return `${ this.formatTime(duration.hours())}:${this.formatTime(duration.minutes()) }`; - } else { - return `${ this.formatTime(duration.hours())}:${this.formatTime(duration.minutes())}:${this.formatTime(duration.seconds())}`; + if (!lessThanMinute) { + const newStartDate = startDate.clone().seconds(0).milliseconds(0); + const newEndDate = endDate.clone().seconds(0).milliseconds(0); + duration = this.getTimeDifference(newStartDate, newEndDate); } + + return this.displayDifference(duration, lessThanMinute); + } + + getTimeDifference(substractDate: moment.Moment, fromDate: moment.Moment): moment.Duration { + return moment.duration(fromDate.diff(substractDate)); + } + + displayDifference(duration: moment.Duration, lessThanMinute) { + const daysInHours = duration.days() >= 1 ? duration.days() * 24 : 0; + const hours = this.formatTime(duration.hours() + daysInHours); + const minutes = this.formatTime(duration.minutes()); + const seconds = lessThanMinute ? `:${this.formatTime(duration.seconds())}` : ''; + return `${hours}:${minutes}${seconds}`; } formatTime(time: number): string { return new NumberFormatter(time).getAsAtLeastTwoDigitString(); } - }