-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtime.ts
executable file
·110 lines (96 loc) · 2.81 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
export const units = {
day: 8.64e7,
hour: 3.6e6,
minute: 60000,
second: 1000,
ms: 1,
} as const;
type Unit = keyof typeof units;
export const quantifiers = {
day: ["d", "day", "days"],
hour: ["h", "hr", "hrs", "hour", "hours"],
minute: ["m", "min", "mins", "minute", "minutes"],
second: ["s", "sec", "secs", "second", "seconds"],
ms: ["ms"],
};
export class DawnTime {
public units: Record<Unit, number> = {
day: 0,
hour: 0,
minute: 0,
second: 0,
ms: 0,
};
constructor(time: number) {
for (const unit in units) {
let amount = 0;
let u = units[unit as Unit];
while (time >= u) {
amount += 1;
time -= u;
}
this.units[unit as Unit] = amount;
}
}
public toMs() {
let result = 0;
for (const i in this.units) {
result += units[i as Unit] * this.units[i as Unit];
}
return result;
}
public toString(ignore?: Unit[]) {
let result = "";
for (const i in this.units)
if (this.units[i as Unit] > 0 && !ignore?.includes(i as Unit))
result += `${this.units[i as Unit]} ${i} `;
return result.trim();
}
get biggestUnit(): Unit | null {
for (const i in this.units) {
if (this.units[i as Unit] !== 0) return i as Unit;
}
return null;
}
public static formatDateString(time: Date, format: string): string {
format = format.replace("YYYY", time.getFullYear().toString());
format = format.replace("MM", time.getMonth().toString().padStart(2, "0"));
format = format.replace("DD", time.getDate().toString().padStart(2, "0"));
format = format.replace("hh", time.getHours().toString().padStart(2, "0"));
format = format.replace(
"mm",
time.getMinutes().toString().padStart(2, "0")
);
format = format.replace(
"ss",
time.getSeconds().toString().padStart(2, "0")
);
return format;
}
public static fromString(timeString: string): DawnTime | null {
let time = new DawnTime(0);
while (timeString.length > 0) {
let amount = timeString.match(/^([0-9]+)/);
if (amount === null) return null;
timeString = timeString.substring(amount[0].length).trim();
let quantifier: Unit | null = null;
for (const qk in quantifiers) {
if (quantifier) break;
for (const q of quantifiers[qk as keyof typeof quantifiers].sort(
(a, b) => b.length - a.length
)) {
if (timeString.match(new RegExp(`^(${q})`, "i"))) {
quantifier = qk.toLowerCase() as Unit;
timeString = timeString.substring(q.length).trim();
break;
}
}
}
if (!quantifier) return null;
time.units[quantifier] = parseInt(amount[0]);
if (timeString.startsWith(","))
timeString = timeString.substring(1).trim();
}
return time;
}
}