@spinajs/util 2.0.409 → 2.0.412

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,460 @@
1
+ import { DateTime } from 'luxon';
2
+ import { _is_number, _non_NaN } from './args.js';
3
+ export class TimeSpan {
4
+ static get TIMEZONE_OFFSET() {
5
+ if (!this._TIMEZONE_OFFSET) {
6
+ this._TIMEZONE_OFFSET = TimeSpan.fromMinutes(new Date().getTimezoneOffset() * -1);
7
+ }
8
+ return TimeSpan._TIMEZONE_OFFSET;
9
+ }
10
+ constructor(millis) {
11
+ this._millis = millis;
12
+ }
13
+ get milliseconds() {
14
+ return TimeSpan.round(this._millis % 1000);
15
+ }
16
+ get seconds() {
17
+ return TimeSpan.round((this._millis / TimeSpan.MILLIS_PER_SECOND) % 60);
18
+ }
19
+ get minutes() {
20
+ return TimeSpan.round((this._millis / TimeSpan.MILLIS_PER_MINUTE) % 60);
21
+ }
22
+ get hours() {
23
+ return TimeSpan.round((this._millis / TimeSpan.MILLIS_PER_HOUR) % 24);
24
+ }
25
+ get days() {
26
+ return TimeSpan.round(this._millis / TimeSpan.MILLIS_PER_DAY);
27
+ }
28
+ get totalDays() {
29
+ return this._millis / TimeSpan.MILLIS_PER_DAY;
30
+ }
31
+ get totalHours() {
32
+ return this._millis / TimeSpan.MILLIS_PER_HOUR;
33
+ }
34
+ get totalMinutes() {
35
+ return this._millis / TimeSpan.MILLIS_PER_MINUTE;
36
+ }
37
+ get totalSeconds() {
38
+ return this._millis / TimeSpan.MILLIS_PER_SECOND;
39
+ }
40
+ get totalMilliseconds() {
41
+ return this._millis;
42
+ }
43
+ add(ts) {
44
+ const result = this._millis + ts.totalMilliseconds;
45
+ return new TimeSpan(result);
46
+ }
47
+ subtract(ts) {
48
+ const result = this._millis - ts.totalMilliseconds;
49
+ return new TimeSpan(result);
50
+ }
51
+ addDays(value) {
52
+ const result = this._millis + value * TimeSpan.MILLIS_PER_DAY;
53
+ return new TimeSpan(result);
54
+ }
55
+ subtractDays(value) {
56
+ const result = this._millis - value * TimeSpan.MILLIS_PER_DAY;
57
+ return new TimeSpan(result);
58
+ }
59
+ addHours(value) {
60
+ const result = this._millis + value * TimeSpan.MILLIS_PER_HOUR;
61
+ return new TimeSpan(result);
62
+ }
63
+ subtractHours(value) {
64
+ const result = this._millis - value * TimeSpan.MILLIS_PER_HOUR;
65
+ return new TimeSpan(result);
66
+ }
67
+ addMinutes(value) {
68
+ const result = this._millis + value * TimeSpan.MILLIS_PER_MINUTE;
69
+ return new TimeSpan(result);
70
+ }
71
+ subtractMinutes(value) {
72
+ const result = this._millis - value * TimeSpan.MILLIS_PER_MINUTE;
73
+ return new TimeSpan(result);
74
+ }
75
+ addSeconds(value) {
76
+ const result = this._millis + value * TimeSpan.MILLIS_PER_SECOND;
77
+ return new TimeSpan(result);
78
+ }
79
+ addMilliseconds(value) {
80
+ const result = this._millis + value;
81
+ return new TimeSpan(result);
82
+ }
83
+ subtractSeconds(value) {
84
+ const result = this._millis - value * TimeSpan.MILLIS_PER_SECOND;
85
+ return new TimeSpan(result);
86
+ }
87
+ subtractMilliseconds(value) {
88
+ const result = this._millis - value;
89
+ return new TimeSpan(result);
90
+ }
91
+ negate() {
92
+ return new TimeSpan(-this._millis);
93
+ }
94
+ equals(value) {
95
+ if (value instanceof TimeSpan) {
96
+ return this._millis === value._millis;
97
+ }
98
+ return false;
99
+ }
100
+ /**
101
+ * Compares this TimeSpan with another TimeSpan
102
+ * @returns -1 if this < other, 0 if equal, 1 if this > other
103
+ */
104
+ compareTo(other) {
105
+ if (this._millis < other._millis)
106
+ return -1;
107
+ if (this._millis > other._millis)
108
+ return 1;
109
+ return 0;
110
+ }
111
+ /**
112
+ * Checks if this TimeSpan is greater than another
113
+ */
114
+ greaterThan(other) {
115
+ return this._millis > other._millis;
116
+ }
117
+ /**
118
+ * Checks if this TimeSpan is greater than or equal to another
119
+ */
120
+ greaterThanOrEqual(other) {
121
+ return this._millis >= other._millis;
122
+ }
123
+ /**
124
+ * Checks if this TimeSpan is less than another
125
+ */
126
+ lessThan(other) {
127
+ return this._millis < other._millis;
128
+ }
129
+ /**
130
+ * Checks if this TimeSpan is less than or equal to another
131
+ */
132
+ lessThanOrEqual(other) {
133
+ return this._millis <= other._millis;
134
+ }
135
+ isTimeInRange(start, end) {
136
+ let startTime;
137
+ let endTime;
138
+ if (start instanceof Date) {
139
+ // Extract time-of-day in milliseconds since midnight
140
+ const startHours = start.getHours();
141
+ const startMinutes = start.getMinutes();
142
+ const startSeconds = start.getSeconds();
143
+ const startMs = start.getMilliseconds();
144
+ startTime = startHours * TimeSpan.MILLIS_PER_HOUR +
145
+ startMinutes * TimeSpan.MILLIS_PER_MINUTE +
146
+ startSeconds * TimeSpan.MILLIS_PER_SECOND +
147
+ startMs;
148
+ }
149
+ else {
150
+ // Luxon DateTime
151
+ startTime = start.hour * TimeSpan.MILLIS_PER_HOUR +
152
+ start.minute * TimeSpan.MILLIS_PER_MINUTE +
153
+ start.second * TimeSpan.MILLIS_PER_SECOND +
154
+ start.millisecond;
155
+ }
156
+ if (end instanceof Date) {
157
+ const endHours = end.getHours();
158
+ const endMinutes = end.getMinutes();
159
+ const endSeconds = end.getSeconds();
160
+ const endMs = end.getMilliseconds();
161
+ endTime = endHours * TimeSpan.MILLIS_PER_HOUR +
162
+ endMinutes * TimeSpan.MILLIS_PER_MINUTE +
163
+ endSeconds * TimeSpan.MILLIS_PER_SECOND +
164
+ endMs;
165
+ }
166
+ else {
167
+ endTime = end.hour * TimeSpan.MILLIS_PER_HOUR +
168
+ end.minute * TimeSpan.MILLIS_PER_MINUTE +
169
+ end.second * TimeSpan.MILLIS_PER_SECOND +
170
+ end.millisecond;
171
+ }
172
+ // Normalize this TimeSpan to a time-of-day (remove days component)
173
+ const thisTimeOfDay = this._millis % TimeSpan.MILLIS_PER_DAY;
174
+ const normalizedTime = thisTimeOfDay >= 0 ? thisTimeOfDay : thisTimeOfDay + TimeSpan.MILLIS_PER_DAY;
175
+ // Check if the time falls within the range
176
+ if (startTime <= endTime) {
177
+ // Normal case: range doesn't cross midnight
178
+ return normalizedTime >= startTime && normalizedTime <= endTime;
179
+ }
180
+ else {
181
+ // Range crosses midnight (e.g., 22:00 to 02:00)
182
+ return normalizedTime >= startTime || normalizedTime <= endTime;
183
+ }
184
+ }
185
+ /**
186
+ * Checks if this TimeSpan (as a time-of-day) falls between two times
187
+ * @param startTime - Start time as TimeSpan
188
+ * @param endTime - End time as TimeSpan
189
+ * @returns true if this time is within the range
190
+ */
191
+ isBetween(startTime, endTime) {
192
+ // Normalize all timespans to time-of-day (0-24 hours)
193
+ const thisTimeOfDay = this._millis % TimeSpan.MILLIS_PER_DAY;
194
+ const normalizedThis = thisTimeOfDay >= 0 ? thisTimeOfDay : thisTimeOfDay + TimeSpan.MILLIS_PER_DAY;
195
+ const startTimeOfDay = startTime._millis % TimeSpan.MILLIS_PER_DAY;
196
+ const normalizedStart = startTimeOfDay >= 0 ? startTimeOfDay : startTimeOfDay + TimeSpan.MILLIS_PER_DAY;
197
+ const endTimeOfDay = endTime._millis % TimeSpan.MILLIS_PER_DAY;
198
+ const normalizedEnd = endTimeOfDay >= 0 ? endTimeOfDay : endTimeOfDay + TimeSpan.MILLIS_PER_DAY;
199
+ if (normalizedStart <= normalizedEnd) {
200
+ // Normal case: range doesn't cross midnight
201
+ return normalizedThis >= normalizedStart && normalizedThis <= normalizedEnd;
202
+ }
203
+ else {
204
+ // Range crosses midnight (e.g., 22:00 to 02:00)
205
+ return normalizedThis >= normalizedStart || normalizedThis <= normalizedEnd;
206
+ }
207
+ }
208
+ /**
209
+ * Returns the absolute value of this TimeSpan
210
+ */
211
+ abs() {
212
+ return this._millis < 0 ? new TimeSpan(-this._millis) : this;
213
+ }
214
+ /**
215
+ * Multiplies the TimeSpan by a factor
216
+ */
217
+ multiply(factor) {
218
+ factor = _is_number(_non_NaN())(factor, 'factor');
219
+ return new TimeSpan(this._millis * factor);
220
+ }
221
+ /**
222
+ * Divides the TimeSpan by a divisor
223
+ */
224
+ divide(divisor) {
225
+ divisor = _is_number(_non_NaN())(divisor, 'divisor');
226
+ if (divisor === 0) {
227
+ throw new Error('Cannot divide TimeSpan by zero');
228
+ }
229
+ return new TimeSpan(this._millis / divisor);
230
+ }
231
+ /**
232
+ * Returns the duration (absolute value) of this TimeSpan
233
+ */
234
+ duration() {
235
+ return this.abs();
236
+ }
237
+ /**
238
+ * Converts TimeSpan to a plain object
239
+ */
240
+ toObject() {
241
+ return {
242
+ days: this.days,
243
+ hours: this.hours,
244
+ minutes: this.minutes,
245
+ seconds: this.seconds,
246
+ milliseconds: this.milliseconds,
247
+ };
248
+ }
249
+ /**
250
+ * Converts this TimeSpan to a JavaScript Date
251
+ * @param baseDate - Optional base date to add the TimeSpan to. Defaults to current time.
252
+ * @returns A Date representing baseDate + this TimeSpan
253
+ */
254
+ toDate(baseDate) {
255
+ const base = baseDate ? baseDate.getTime() : Date.now();
256
+ return new Date(base + this._millis);
257
+ }
258
+ /**
259
+ * Converts this TimeSpan to a Luxon DateTime
260
+ * @param baseDateTime - Optional base DateTime to add the TimeSpan to. Defaults to current time.
261
+ * @returns A DateTime representing baseDateTime + this TimeSpan
262
+ */
263
+ toDateTime(baseDateTime) {
264
+ const base = baseDateTime || DateTime.now();
265
+ return base.plus({ milliseconds: this._millis });
266
+ }
267
+ valueOf() {
268
+ return this._millis;
269
+ }
270
+ toJSON() {
271
+ return this.toString();
272
+ }
273
+ toString() {
274
+ const absMillis = Math.abs(this._millis);
275
+ const negative = this._millis < 0;
276
+ const d = Math.floor(absMillis / TimeSpan.MILLIS_PER_DAY);
277
+ const h = Math.floor((absMillis % TimeSpan.MILLIS_PER_DAY) / TimeSpan.MILLIS_PER_HOUR);
278
+ const m = Math.floor((absMillis % TimeSpan.MILLIS_PER_HOUR) / TimeSpan.MILLIS_PER_MINUTE);
279
+ const s = Math.floor((absMillis % TimeSpan.MILLIS_PER_MINUTE) / TimeSpan.MILLIS_PER_SECOND);
280
+ const ms = Math.floor(absMillis % TimeSpan.MILLIS_PER_SECOND);
281
+ let text = '';
282
+ // Include days if present
283
+ if (d > 0) {
284
+ text = `${d}.${to2Digits(h)}:${to2Digits(m)}:${to2Digits(s)}`;
285
+ }
286
+ else {
287
+ text = `${to2Digits(h)}:${to2Digits(m)}:${to2Digits(s)}`;
288
+ }
289
+ // Include milliseconds if present
290
+ if (ms > 0) {
291
+ text += `.${String(ms).padStart(3, '0')}`;
292
+ }
293
+ if (negative) {
294
+ text = '-' + text;
295
+ }
296
+ return text;
297
+ }
298
+ static fromDays(value) {
299
+ return TimeSpan.interval(value, TimeSpan.MILLIS_PER_DAY);
300
+ }
301
+ static fromHours(value) {
302
+ return TimeSpan.interval(value, TimeSpan.MILLIS_PER_HOUR);
303
+ }
304
+ static fromMilliseconds(value) {
305
+ return TimeSpan.interval(value, 1);
306
+ }
307
+ static fromMinutes(value) {
308
+ return TimeSpan.interval(value, TimeSpan.MILLIS_PER_MINUTE);
309
+ }
310
+ static fromSeconds(value) {
311
+ return TimeSpan.interval(value, TimeSpan.MILLIS_PER_SECOND);
312
+ }
313
+ /**
314
+ * Creates a TimeSpan from a JavaScript Date object
315
+ * Represents the time elapsed from the given date until now
316
+ * @param date - The date to calculate elapsed time from
317
+ * @returns A TimeSpan representing the elapsed time
318
+ */
319
+ static fromDate(date) {
320
+ const elapsed = Date.now() - date.getTime();
321
+ return new TimeSpan(elapsed);
322
+ }
323
+ /**
324
+ * Creates a TimeSpan from a Luxon DateTime object
325
+ * Represents the time elapsed from the given DateTime until now
326
+ * @param dateTime - The DateTime to calculate elapsed time from
327
+ * @returns A TimeSpan representing the elapsed time
328
+ */
329
+ static fromDateTime(dateTime) {
330
+ const elapsed = DateTime.now().toMillis() - dateTime.toMillis();
331
+ return new TimeSpan(elapsed);
332
+ }
333
+ static between(date1, date2) {
334
+ let millis1;
335
+ let millis2;
336
+ if (date1 instanceof Date) {
337
+ millis1 = date1.getTime();
338
+ }
339
+ else {
340
+ millis1 = date1.toMillis();
341
+ }
342
+ if (date2 instanceof Date) {
343
+ millis2 = date2.getTime();
344
+ }
345
+ else {
346
+ millis2 = date2.toMillis();
347
+ }
348
+ return new TimeSpan(millis1 - millis2);
349
+ }
350
+ static fromTime(daysOrHours, hoursOrMinutes, minutesOrSeconds, seconds, milliseconds) {
351
+ if (milliseconds != undefined) {
352
+ return this.fromTimeStartingFromDays(daysOrHours, hoursOrMinutes, minutesOrSeconds, seconds, milliseconds);
353
+ }
354
+ else {
355
+ return this.fromTimeStartingFromHours(daysOrHours, hoursOrMinutes, minutesOrSeconds, 0);
356
+ }
357
+ }
358
+ static fromTimeStartingFromHours(hours, minutes, seconds, milliseconds) {
359
+ hours = _is_number(_non_NaN())(hours, 'hours');
360
+ minutes = _is_number(_non_NaN())(minutes, 'minutes');
361
+ seconds = _is_number(_non_NaN())(seconds, 'seconds');
362
+ milliseconds = _is_number(_non_NaN())(milliseconds, 'milliseconds');
363
+ const millis = TimeSpan.timeToMilliseconds(hours, minutes, seconds) + milliseconds;
364
+ return new TimeSpan(millis);
365
+ }
366
+ static fromTimeStartingFromDays(days, hours, minutes, seconds, milliseconds) {
367
+ days = _is_number(_non_NaN())(days, 'days');
368
+ hours = _is_number(_non_NaN())(hours, 'hours');
369
+ minutes = _is_number(_non_NaN())(minutes, 'minutes');
370
+ seconds = _is_number(_non_NaN())(seconds, 'seconds');
371
+ milliseconds = _is_number(_non_NaN())(milliseconds, 'milliseconds');
372
+ const totalMilliSeconds = days * TimeSpan.MILLIS_PER_DAY +
373
+ hours * TimeSpan.MILLIS_PER_HOUR +
374
+ minutes * TimeSpan.MILLIS_PER_MINUTE +
375
+ seconds * TimeSpan.MILLIS_PER_SECOND +
376
+ milliseconds;
377
+ if (totalMilliSeconds > TimeSpan.MAX_VALUE.totalMilliseconds ||
378
+ totalMilliSeconds < TimeSpan.MIN_VALUE.totalMilliseconds) {
379
+ throw new Error('TimeSpanTooLong');
380
+ }
381
+ return new TimeSpan(totalMilliSeconds);
382
+ }
383
+ static parse(span) {
384
+ if (span instanceof TimeSpan) {
385
+ return span;
386
+ }
387
+ if (span instanceof Date) {
388
+ // Calculate time elapsed since the date
389
+ span = Date.now() - span.getTime();
390
+ }
391
+ if (typeof span === 'number') {
392
+ return new TimeSpan(span);
393
+ }
394
+ if (!span) {
395
+ return null;
396
+ }
397
+ if (typeof span === 'object') {
398
+ const { days, hours, minutes, seconds, milliseconds } = span;
399
+ return TimeSpan.fromTime(days || 0, hours || 0, minutes || 0, seconds || 0, milliseconds || 0);
400
+ }
401
+ // Parse string format: "[d.]hh:mm:ss[.fff]"
402
+ // Examples: "12:30:45", "1.12:30:45", "12:30:45.123"
403
+ const tokens = span.split(':');
404
+ if (tokens.length < 3) {
405
+ throw new Error('Invalid TimeSpan format. Expected format: "[d.]hh:mm:ss[.fff]"');
406
+ }
407
+ const secondsParts = tokens[2].split('.');
408
+ let milliseconds = 0;
409
+ if (secondsParts.length === 2) {
410
+ // Pad or truncate to 3 digits
411
+ const msString = secondsParts[1].padEnd(3, '0').slice(0, 3);
412
+ milliseconds = +msString;
413
+ }
414
+ const daysParts = tokens[0].split('.');
415
+ if (daysParts.length === 2) {
416
+ // Format: "d.hh:mm:ss[.fff]"
417
+ return TimeSpan.fromTimeStartingFromDays(+daysParts[0], +daysParts[1], +tokens[1], +secondsParts[0], milliseconds);
418
+ }
419
+ // Format: "hh:mm:ss[.fff]"
420
+ return TimeSpan.fromTimeStartingFromHours(+tokens[0], +tokens[1], +secondsParts[0], milliseconds);
421
+ }
422
+ static interval(value, scale) {
423
+ value = _is_number(_non_NaN())(value, 'value');
424
+ const tmp = value * scale;
425
+ const millis = TimeSpan.round(tmp + (value >= 0 ? 0.5 : -0.5));
426
+ if (millis > TimeSpan.MAX_VALUE.totalMilliseconds ||
427
+ millis < TimeSpan.MIN_VALUE.totalMilliseconds) {
428
+ throw new Error('TimeSpanTooLong');
429
+ }
430
+ return new TimeSpan(millis);
431
+ }
432
+ static round(n) {
433
+ if (n < 0) {
434
+ return Math.ceil(n);
435
+ }
436
+ else if (n > 0) {
437
+ return Math.floor(n);
438
+ }
439
+ return 0;
440
+ }
441
+ static timeToMilliseconds(hour, minute, second) {
442
+ const totalSeconds = hour * 3600 + minute * 60 + second;
443
+ if (totalSeconds > TimeSpan.MAX_VALUE.totalSeconds ||
444
+ totalSeconds < TimeSpan.MIN_VALUE.totalSeconds) {
445
+ throw new Error('TimeSpanTooLong');
446
+ }
447
+ return totalSeconds * TimeSpan.MILLIS_PER_SECOND;
448
+ }
449
+ }
450
+ TimeSpan.MILLIS_PER_SECOND = 1000;
451
+ TimeSpan.MILLIS_PER_MINUTE = TimeSpan.MILLIS_PER_SECOND * 60;
452
+ TimeSpan.MILLIS_PER_HOUR = TimeSpan.MILLIS_PER_MINUTE * 60;
453
+ TimeSpan.MILLIS_PER_DAY = TimeSpan.MILLIS_PER_HOUR * 24;
454
+ TimeSpan.ZERO = new TimeSpan(0);
455
+ TimeSpan.MAX_VALUE = new TimeSpan(Number.MAX_SAFE_INTEGER);
456
+ TimeSpan.MIN_VALUE = new TimeSpan(Number.MIN_SAFE_INTEGER);
457
+ function to2Digits(n) {
458
+ return String(n).padStart(2, '0');
459
+ }
460
+ //# sourceMappingURL=timespan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timespan.js","sourceRoot":"","sources":["../../src/timespan.ts"],"names":[],"mappings":"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"}