Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
"d3-zoom": "^1.8.3",
"graphql": "^15.4.0",
"graphql-tag": "^2.11.0",
"iso8601-duration": "^1.3.0",
"lodash-es": "^4.17.20",
"rxjs": "~6.6.3",
"tslib": "^2.1.0",
Expand Down
10 changes: 10 additions & 0 deletions projects/common/src/time/time-duration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,14 @@ describe('Time duration', () => {
new TimeDuration(0, TimeUnit.Millisecond)
);
});

test('can parse ISO 8601 duration string', () => {
let duration = TimeDuration.parse('PT1H');
expect(duration.value).toBe(3600);
expect(duration.unit).toBe(TimeUnit.Second);

duration = TimeDuration.parse('PT1H5M');
expect(duration.value).toBe(3900);
expect(duration.unit).toBe(TimeUnit.Second);
});
});
6 changes: 6 additions & 0 deletions projects/common/src/time/time-duration.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { parse, toSeconds } from 'iso8601-duration';
import { assertUnreachable } from '../utilities/lang/lang-utils';
import { TimeUnit } from './time-unit.type';

export class TimeDuration {
private readonly millis: number;

public constructor(public readonly value: number, public readonly unit: TimeUnit) {
this.toUnitString(); // Fail if unrecognized TimeUnit
this.millis = this.normalizeToMillis(value, unit);
Expand All @@ -12,6 +14,10 @@ export class TimeDuration {
return this.millis;
}

public static parse(durationString: string): TimeDuration {
return new TimeDuration(toSeconds(parse(durationString)), TimeUnit.Second);
}

public getAmountForUnit(unit: ConvertibleTimeUnit): number {
return this.toMillis() / this.unitInMillis(unit);
}
Expand Down