-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathtime.ts
44 lines (44 loc) · 1.03 KB
/
time.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* Format duration in the form of XdXhXm.
* @param seconds - Duration to be formatted, in seconds.
* @param trim - Whether to trim zero components (e.g. 1d0h5m to 1d5m).
* @returns
*/
export function formatDuration(seconds: number, trim = false): string {
if (seconds < 0) {
return '-' + formatDuration(-seconds);
}
if (seconds < 60) {
return trim ? '0m' : '0d0h0m';
}
if (!isFinite(seconds)) {
return 'Forever';
}
if (seconds > 3_153_600_000) {
return '>100yr';
}
const yy = Math.floor(seconds / 31_536_000);
seconds -= yy * 31536000;
const dd = Math.floor(seconds / 86400);
seconds -= dd * 86400;
const hh = Math.floor(seconds / 3600);
seconds -= hh * 3600;
const mm = Math.floor(seconds / 60);
let s = '';
if (yy > 0) {
s += `${yy}y`;
}
if (!trim || dd > 0) {
s += `${dd}d`;
}
// leave out hours/seconds for durations > 1yr
if (!trim || yy < 1) {
if (!trim || hh > 0) {
s += `${hh}h`;
}
if (!trim || mm > 0) {
s += `${mm}m`;
}
}
return s;
}