Skip to content

Commit ae07526

Browse files
authored
feat: add support for long format in multi unit string (#500)
* feat: add support for long format in multi unit string
1 parent 9946ae9 commit ae07526

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

projects/common/src/time/time-duration.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { TimeDuration } from './time-duration';
1+
import { TimeDuration, UnitStringType } from './time-duration';
22
import { TimeUnit } from './time-unit.type';
33

44
describe('Time duration', () => {
@@ -13,6 +13,13 @@ describe('Time duration', () => {
1313
TimeUnit.Minute
1414
)
1515
).toBe('4h3m');
16+
expect(
17+
new TimeDuration(4 * 60 * 60 * 1000 + 3 * 60 * 1000 + 5 * 1000 + 689, TimeUnit.Millisecond).toMultiUnitString(
18+
TimeUnit.Minute,
19+
false,
20+
UnitStringType.Long
21+
)
22+
).toBe('4 hours 3 minutes');
1623
expect(
1724
new TimeDuration(4 * 60 * 60 * 1000 + 5 * 1000 + 689, TimeUnit.Millisecond).toMultiUnitString(TimeUnit.Second)
1825
).toBe('4h5s');

projects/common/src/time/time-duration.ts

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,30 @@ export class TimeDuration {
1616
return this.toMillis() / this.unitInMillis(unit);
1717
}
1818

19-
public toMultiUnitString(smallestUnit: ConvertibleTimeUnit = TimeUnit.Second, displayZero: boolean = true): string {
19+
public toMultiUnitString(
20+
smallestUnit: ConvertibleTimeUnit = TimeUnit.Second,
21+
displayZero: boolean = true,
22+
unitStringType: UnitStringType = UnitStringType.Short
23+
): string {
2024
const mostSignificantPortion = this.getMostSignificantUnitOnly();
2125
const remainingMillis = this.millis - mostSignificantPortion.toMillis();
2226
if (mostSignificantPortion.getAmountForUnit(smallestUnit) < 1) {
23-
return displayZero ? new TimeDuration(0, smallestUnit).toString() : '';
27+
return displayZero ? new TimeDuration(0, smallestUnit).toFormattedString(unitStringType) : '';
2428
}
2529
if (mostSignificantPortion.unit === smallestUnit || remainingMillis === 0) {
26-
return mostSignificantPortion.toString();
30+
return mostSignificantPortion.toFormattedString(unitStringType);
2731
}
2832

29-
return `${mostSignificantPortion.toString()}${new TimeDuration(
30-
remainingMillis,
31-
TimeUnit.Millisecond
32-
).toMultiUnitString(smallestUnit, false)}`;
33+
const joiningStr = unitStringType === UnitStringType.Long ? ' ' : '';
34+
35+
return [
36+
mostSignificantPortion.toFormattedString(unitStringType),
37+
new TimeDuration(remainingMillis, TimeUnit.Millisecond).toMultiUnitString(smallestUnit, false, unitStringType)
38+
].join(joiningStr);
39+
}
40+
41+
private toFormattedString(unitStringType: UnitStringType = UnitStringType.Short): string {
42+
return unitStringType === UnitStringType.Short ? this.toString() : this.toLongString();
3343
}
3444

3545
public getMostSignificantUnitOnly(): TimeDuration {
@@ -141,3 +151,8 @@ type ConvertibleTimeUnit =
141151
| TimeUnit.Minute
142152
| TimeUnit.Second
143153
| TimeUnit.Millisecond;
154+
155+
export enum UnitStringType {
156+
Long = 'long',
157+
Short = 'short'
158+
}

0 commit comments

Comments
 (0)