small date utilities
4.8 kB
226 lines
1export type DayOfWeek = 0 | 1 | 2 | 3 | 4 | 5 | 6;
2
3export const getUnixMs = (date: Date): number => {
4 return date.getTime();
5};
6
7export const getMilliseconds = (date: Date): number => {
8 return date.getMilliseconds();
9};
10
11export const getSeconds = (date: Date): number => {
12 return date.getSeconds();
13};
14
15export const getMinutes = (date: Date): number => {
16 return date.getMinutes();
17};
18
19export const getHours = (date: Date): number => {
20 return date.getHours();
21};
22
23export const getDayOfWeek = (date: Date): DayOfWeek => {
24 return date.getDay() as DayOfWeek;
25};
26
27export const getDayOfMonth = (date: Date): number => {
28 return date.getDate();
29};
30
31export const getMonth = (date: Date): number => {
32 return date.getMonth();
33};
34
35export const getYear = (date: Date): number => {
36 return date.getFullYear();
37};
38
39export const isDatetimeBefore = (date: Date, compare: Date): boolean => {
40 return date !== compare && getUnixMs(date) < getUnixMs(compare);
41};
42
43export const isDatetimeAfter = (date: Date, compare: Date): boolean => {
44 return date !== compare && getUnixMs(date) > getUnixMs(compare);
45};
46
47export const isDatetimeSame = (a: Date, b: Date): boolean => {
48 return a === b || getUnixMs(a) === getUnixMs(b);
49};
50
51export const isDateSame = (a: Date, b: Date): boolean => {
52 if (a === b) {
53 return true;
54 }
55
56 return getDayOfMonth(a) === getDayOfMonth(b) && getMonth(a) === getMonth(b) && getYear(a) === getYear(b);
57};
58
59export const isMonthSame = (a: Date, b: Date): boolean => {
60 if (a === b) {
61 return true;
62 }
63
64 return getMonth(a) === getMonth(b) && getYear(a) === getYear(b);
65};
66
67export const isYearSame = (a: Date, b: Date): boolean => {
68 if (a === b) {
69 return true;
70 }
71
72 return getYear(a) === getYear(b);
73};
74
75export const min = (a: Date, b: Date): Date => {
76 return isDatetimeBefore(a, b) ? a : b;
77};
78
79export const max = (a: Date, b: Date): Date => {
80 return isDatetimeAfter(a, b) ? a : b;
81};
82
83export const clamp = (date: Date, min: Date | undefined, max: Date | undefined): Date => {
84 if (min !== undefined && isDatetimeBefore(date, min)) {
85 return min;
86 }
87
88 if (max !== undefined && isDatetimeAfter(date, max)) {
89 return max;
90 }
91
92 return date;
93};
94
95export const cloneDate = (date: Date): Date => {
96 return new Date(date);
97};
98
99export const startOfDay = (date: Date): Date => {
100 const d = cloneDate(date);
101
102 d.setHours(0, 0, 0, 0);
103 return d;
104};
105
106export const endOfDay = (date: Date): Date => {
107 const d = cloneDate(date);
108
109 d.setHours(23, 59, 59, 999);
110 return d;
111};
112
113export const startOfWeek = (date: Date): Date => {
114 const d = cloneDate(date);
115
116 d.setDate(getDayOfMonth(d) - getDayOfWeek(d));
117 d.setHours(0, 0, 0, 0);
118 return d;
119};
120
121export const endOfWeek = (date: Date): Date => {
122 const d = cloneDate(date);
123
124 d.setDate(getDayOfMonth(d) + (6 - getDayOfWeek(d)));
125 d.setHours(23, 59, 59, 999);
126 return d;
127};
128
129export const startOfMonth = (date: Date): Date => {
130 const d = cloneDate(date);
131
132 d.setDate(1);
133 d.setHours(0, 0, 0, 0);
134 return d;
135};
136
137export const endOfMonth = (date: Date): Date => {
138 const d = cloneDate(date);
139
140 d.setMonth(getMonth(d) + 1, 0);
141 d.setHours(23, 59, 59, 999);
142 return d;
143};
144
145export const startOfYear = (date: Date): Date => {
146 const d = cloneDate(date);
147
148 d.setMonth(0, 1);
149 d.setHours(0, 0, 0, 0);
150 return d;
151};
152
153export const endOfYear = (date: Date): Date => {
154 const d = cloneDate(date);
155
156 d.setMonth(11, 31);
157 d.setHours(23, 59, 59, 999);
158 return d;
159};
160
161export const addMilliseconds = (date: Date, milliseconds: number): Date => {
162 const d = cloneDate(date);
163
164 d.setMilliseconds(getMilliseconds(d) + milliseconds);
165 return d;
166};
167
168export const addSeconds = (date: Date, seconds: number): Date => {
169 const d = cloneDate(date);
170
171 d.setSeconds(getSeconds(d) + seconds);
172 return d;
173};
174
175export const addMinutes = (date: Date, minutes: number): Date => {
176 const d = cloneDate(date);
177
178 d.setMinutes(getMinutes(d) + minutes);
179 return d;
180};
181
182export const addHours = (date: Date, hours: number): Date => {
183 const d = cloneDate(date);
184
185 d.setHours(getHours(d) + hours);
186 return d;
187};
188
189export const addDays = (date: Date, days: number): Date => {
190 const d = cloneDate(date);
191
192 d.setDate(getDayOfMonth(d) + days);
193 return d;
194};
195
196export const addMonths = (date: Date, months: number): Date => {
197 const d = cloneDate(date);
198
199 d.setMonth(getMonth(d) + months);
200 return d;
201};
202
203export const addYears = (date: Date, years: number): Date => {
204 const d = cloneDate(date);
205
206 d.setFullYear(getYear(d) + years);
207 return d;
208};
209
210export const previousDay = (date: Date, day: DayOfWeek): Date => {
211 let delta = day - getDayOfWeek(date);
212 if (delta >= 0) {
213 delta -= 7;
214 }
215
216 return addDays(date, delta);
217};
218
219export const nextDay = (date: Date, day: DayOfWeek): Date => {
220 let delta = day - getDayOfWeek(date);
221 if (delta <= 0) {
222 delta += 7;
223 }
224
225 return addDays(date, delta);
226};