@pbkware/dot-net-date-number-formatting 0.2.0

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,604 @@
1
+ import { Err, Ok } from "@pbkware/js-utils";
2
+ import { DotNetDateTimeStyleId, DotNetDateTimeStyles, } from "./datetime-style.js";
3
+ import { DotNetLocaleSettings } from "./locale-settings.js";
4
+ const dayNamesShort = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
5
+ const dayNamesLong = [
6
+ "Sunday",
7
+ "Monday",
8
+ "Tuesday",
9
+ "Wednesday",
10
+ "Thursday",
11
+ "Friday",
12
+ "Saturday",
13
+ ];
14
+ const monthNamesShort = [
15
+ "Jan",
16
+ "Feb",
17
+ "Mar",
18
+ "Apr",
19
+ "May",
20
+ "Jun",
21
+ "Jul",
22
+ "Aug",
23
+ "Sep",
24
+ "Oct",
25
+ "Nov",
26
+ "Dec",
27
+ ];
28
+ const monthNamesLong = [
29
+ "January",
30
+ "February",
31
+ "March",
32
+ "April",
33
+ "May",
34
+ "June",
35
+ "July",
36
+ "August",
37
+ "September",
38
+ "October",
39
+ "November",
40
+ "December",
41
+ ];
42
+ function pad(value, len) {
43
+ return value.toString().padStart(len, "0");
44
+ }
45
+ function formatStandard(token, date, locale) {
46
+ switch (token) {
47
+ case "d":
48
+ return new Intl.DateTimeFormat(locale, { dateStyle: "short" }).format(date);
49
+ case "D":
50
+ return new Intl.DateTimeFormat(locale, { dateStyle: "full" }).format(date);
51
+ case "f":
52
+ return new Intl.DateTimeFormat(locale, {
53
+ dateStyle: "full",
54
+ timeStyle: "short",
55
+ }).format(date);
56
+ case "F":
57
+ return new Intl.DateTimeFormat(locale, {
58
+ dateStyle: "full",
59
+ timeStyle: "medium",
60
+ }).format(date);
61
+ case "g":
62
+ return new Intl.DateTimeFormat(locale, {
63
+ dateStyle: "short",
64
+ timeStyle: "short",
65
+ }).format(date);
66
+ case "G":
67
+ return new Intl.DateTimeFormat(locale, {
68
+ dateStyle: "short",
69
+ timeStyle: "medium",
70
+ }).format(date);
71
+ case "M":
72
+ case "m":
73
+ return `${monthNamesLong[date.getMonth()]} ${date.getDate()}`;
74
+ case "O":
75
+ case "o":
76
+ return date.toISOString();
77
+ case "s":
78
+ return `${pad(date.getFullYear(), 4)}-${pad(date.getMonth() + 1, 2)}-${pad(date.getDate(), 2)}T${pad(date.getHours(), 2)}:${pad(date.getMinutes(), 2)}:${pad(date.getSeconds(), 2)}`;
79
+ case "t":
80
+ return new Intl.DateTimeFormat(locale, { timeStyle: "short" }).format(date);
81
+ case "T":
82
+ return new Intl.DateTimeFormat(locale, { timeStyle: "medium" }).format(date);
83
+ case "u":
84
+ return date.toISOString().replace("T", " ").replace("Z", "Z");
85
+ case "Y":
86
+ case "y":
87
+ return `${pad(date.getFullYear(), 4)} ${monthNamesLong[date.getMonth()]}`;
88
+ default:
89
+ return "?";
90
+ }
91
+ }
92
+ function tokenizeCustom(format) {
93
+ const elements = [];
94
+ let index = 0;
95
+ const pushLiteral = (text) => {
96
+ if (text.length > 0) {
97
+ elements.push({ type: "literal", text });
98
+ }
99
+ };
100
+ while (index < format.length) {
101
+ const current = format[index];
102
+ if (current === "'" || current === '"') {
103
+ const quote = current;
104
+ index += 1;
105
+ let literal = "";
106
+ while (index < format.length && format[index] !== quote) {
107
+ literal += format[index];
108
+ index += 1;
109
+ }
110
+ if (index >= format.length) {
111
+ return new Err("Unterminated quoted literal in format");
112
+ }
113
+ index += 1;
114
+ pushLiteral(literal);
115
+ continue;
116
+ }
117
+ if (current === "\\") {
118
+ index += 1;
119
+ if (index >= format.length) {
120
+ return new Err("Single-char literal escape at end of format");
121
+ }
122
+ pushLiteral(format[index]);
123
+ index += 1;
124
+ continue;
125
+ }
126
+ if (current === "%") {
127
+ index += 1;
128
+ continue;
129
+ }
130
+ let runLength = 1;
131
+ while (index + runLength < format.length &&
132
+ format[index + runLength] === current) {
133
+ runLength += 1;
134
+ }
135
+ const consume = () => {
136
+ index += runLength;
137
+ };
138
+ switch (current) {
139
+ case "d":
140
+ if (runLength === 1)
141
+ elements.push({ type: "day" });
142
+ else if (runLength === 2)
143
+ elements.push({ type: "day2" });
144
+ else if (runLength === 3)
145
+ elements.push({ type: "dayNameShort" });
146
+ else if (runLength === 4)
147
+ elements.push({ type: "dayNameLong" });
148
+ else
149
+ return new Err("Too many repeated d characters");
150
+ consume();
151
+ break;
152
+ case "M":
153
+ if (runLength === 1)
154
+ elements.push({ type: "month" });
155
+ else if (runLength === 2)
156
+ elements.push({ type: "month2" });
157
+ else if (runLength === 3)
158
+ elements.push({ type: "monthNameShort" });
159
+ else if (runLength === 4)
160
+ elements.push({ type: "monthNameLong" });
161
+ else
162
+ return new Err("Too many repeated M characters");
163
+ consume();
164
+ break;
165
+ case "y":
166
+ if (runLength === 1 || runLength === 2)
167
+ elements.push({ type: "year2" });
168
+ else if (runLength === 3)
169
+ elements.push({ type: "year3" });
170
+ else if (runLength === 4)
171
+ elements.push({ type: "year4" });
172
+ else if (runLength === 5)
173
+ elements.push({ type: "year5" });
174
+ else
175
+ return new Err("Too many repeated y characters");
176
+ consume();
177
+ break;
178
+ case "h":
179
+ elements.push({ type: runLength === 1 ? "hour12" : "hour12_2" });
180
+ consume();
181
+ break;
182
+ case "H":
183
+ elements.push({ type: runLength === 1 ? "hour24" : "hour24_2" });
184
+ consume();
185
+ break;
186
+ case "m":
187
+ elements.push({ type: runLength === 1 ? "minute" : "minute2" });
188
+ consume();
189
+ break;
190
+ case "s":
191
+ elements.push({ type: runLength === 1 ? "second" : "second2" });
192
+ consume();
193
+ break;
194
+ case "f":
195
+ elements.push({ type: "fraction", len: Math.min(runLength, 7) });
196
+ consume();
197
+ break;
198
+ case "F":
199
+ elements.push({ type: "fractionTrim", len: Math.min(runLength, 7) });
200
+ consume();
201
+ break;
202
+ case "t":
203
+ elements.push({ type: runLength === 1 ? "amPm1" : "amPm2" });
204
+ consume();
205
+ break;
206
+ case "/":
207
+ elements.push({ type: "dateSep" });
208
+ consume();
209
+ break;
210
+ case ":":
211
+ elements.push({ type: "timeSep" });
212
+ consume();
213
+ break;
214
+ default:
215
+ pushLiteral(current.repeat(runLength));
216
+ consume();
217
+ break;
218
+ }
219
+ }
220
+ return new Ok(elements);
221
+ }
222
+ /**
223
+ * Formatter for dates and times using .NET-compatible format strings.
224
+ *
225
+ * Supports both standard format strings (d, D, f, F, g, G, M, O, s, t, T, u, Y) and
226
+ * custom format strings with specific date/time components (yyyy, MM, dd, HH, mm, ss, etc.).
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * const formatter = new DotNetDateTimeFormatter();
231
+ * formatter.localeSettings = DotNetLocaleSettings.createInvariant();
232
+ *
233
+ * // Standard format strings
234
+ * formatter.trySetFormat('d'); // Short date
235
+ * console.log(formatter.toString(new Date(2024, 6, 5))); // "7/5/2024"
236
+ *
237
+ * formatter.trySetFormat('F'); // Full date/time
238
+ * console.log(formatter.toString(new Date(2024, 6, 5, 14, 30, 0)));
239
+ * // "Friday, July 5, 2024 2:30:00 PM"
240
+ *
241
+ * // Custom format strings
242
+ * formatter.trySetFormat('yyyy-MM-dd');
243
+ * console.log(formatter.toString(new Date(2024, 6, 5))); // "2024-07-05"
244
+ *
245
+ * formatter.trySetFormat("dddd, MMMM d 'at' h:mm tt");
246
+ * console.log(formatter.toString(new Date(2024, 6, 5, 14, 30, 0)));
247
+ * // "Friday, July 5 at 2:30 PM"
248
+ * ```
249
+ *
250
+ * @public
251
+ * @category DateTime Formatting
252
+ */
253
+ export class DotNetDateTimeFormatter {
254
+ /**
255
+ * Set of date/time style flags that are not currently supported by this implementation.
256
+ * Operations using these styles will fail.
257
+ */
258
+ static unsupportedStyles = new Set([
259
+ DotNetDateTimeStyleId.AdjustToUniversal,
260
+ DotNetDateTimeStyleId.AssumeLocal,
261
+ DotNetDateTimeStyleId.AssumeUniversal,
262
+ DotNetDateTimeStyleId.RoundTripKind,
263
+ ]);
264
+ format = "";
265
+ /**
266
+ * The set of {@link DotNetDateTimeStyleId} flags that control date/time parsing behavior.
267
+ * Currently only used for future parsing functionality.
268
+ */
269
+ styles = new Set(DotNetDateTimeStyles.none);
270
+ /**
271
+ * The locale settings that determine date/time separators and formatting conventions.
272
+ */
273
+ localeSettings = DotNetLocaleSettings.current;
274
+ formatIsStandard = false;
275
+ elements = [];
276
+ /**
277
+ * Contains the error message from the last failed operation.
278
+ * Check this property if {@link DotNetDateTimeFormatter.trySetFormat} returns an error.
279
+ */
280
+ parseErrorText = "";
281
+ /**
282
+ * Sets the format string to use for formatting dates and times.
283
+ *
284
+ * The format string is tokenized to confirm validity and to optimize formatting/parsing operations.
285
+ *
286
+ * @param value - A standard format string (single character like 'd', 'F', 'o') or
287
+ * custom format string (e.g., "yyyy-MM-dd HH:mm:ss").
288
+ * @returns A Result indicating success or containing an error message if the format string is invalid.
289
+ *
290
+ * @example
291
+ * ```typescript
292
+ * // Standard format
293
+ * formatter.trySetFormat('d'); // Short date
294
+ *
295
+ * // Custom format
296
+ * formatter.trySetFormat('yyyy-MM-dd HH:mm:ss');
297
+ *
298
+ * // Check for errors
299
+ * const result = formatter.trySetFormat('');
300
+ * if (result.isErr()) {
301
+ * console.error(result.error); // "Format text cannot be empty"
302
+ * }
303
+ * ```
304
+ */
305
+ trySetFormat(value) {
306
+ if (value.length === 0) {
307
+ return new Err("Format text cannot be empty");
308
+ }
309
+ this.format = value;
310
+ this.formatIsStandard = value.length === 1;
311
+ if (this.formatIsStandard) {
312
+ this.elements = [{ type: "standard", text: value }];
313
+ return new Ok(undefined);
314
+ }
315
+ const parsed = tokenizeCustom(value);
316
+ if (parsed.isErr()) {
317
+ return parsed.createType();
318
+ }
319
+ this.elements = parsed.value;
320
+ return new Ok(undefined);
321
+ }
322
+ /**
323
+ * Formats a Date using the current format string.
324
+ *
325
+ * @param value - The Date to format.
326
+ * @returns The formatted date/time string.
327
+ *
328
+ * @example
329
+ * ```typescript
330
+ * const date = new Date(2024, 6, 5, 14, 30, 45);
331
+ *
332
+ * formatter.trySetFormat('d');
333
+ * console.log(formatter.toString(date)); // "7/5/2024"
334
+ *
335
+ * formatter.trySetFormat('yyyy-MM-dd HH:mm:ss');
336
+ * console.log(formatter.toString(date)); // "2024-07-05 14:30:45"
337
+ * ```
338
+ */
339
+ toString(value) {
340
+ if (this.formatIsStandard) {
341
+ return formatStandard(this.format, value, this.localeSettings.name);
342
+ }
343
+ let result = "";
344
+ const hour = value.getHours();
345
+ const hour12 = hour % 12 === 0 ? 12 : hour % 12;
346
+ for (const element of this.elements) {
347
+ switch (element.type) {
348
+ case "day":
349
+ result += value.getDate().toString();
350
+ break;
351
+ case "day2":
352
+ result += pad(value.getDate(), 2);
353
+ break;
354
+ case "dayNameShort":
355
+ result += dayNamesShort[value.getDay()];
356
+ break;
357
+ case "dayNameLong":
358
+ result += dayNamesLong[value.getDay()];
359
+ break;
360
+ case "month":
361
+ result += (value.getMonth() + 1).toString();
362
+ break;
363
+ case "month2":
364
+ result += pad(value.getMonth() + 1, 2);
365
+ break;
366
+ case "monthNameShort":
367
+ result += monthNamesShort[value.getMonth()];
368
+ break;
369
+ case "monthNameLong":
370
+ result += monthNamesLong[value.getMonth()];
371
+ break;
372
+ case "year2":
373
+ result += (value.getFullYear() % 100).toString();
374
+ break;
375
+ case "year3":
376
+ result += pad(value.getFullYear(), 3);
377
+ break;
378
+ case "year4":
379
+ result += pad(value.getFullYear(), 4);
380
+ break;
381
+ case "year5":
382
+ result += pad(value.getFullYear(), 5);
383
+ break;
384
+ case "hour12":
385
+ result += hour12.toString();
386
+ break;
387
+ case "hour12_2":
388
+ result += pad(hour12, 2);
389
+ break;
390
+ case "hour24":
391
+ result += hour.toString();
392
+ break;
393
+ case "hour24_2":
394
+ result += pad(hour, 2);
395
+ break;
396
+ case "minute":
397
+ result += value.getMinutes().toString();
398
+ break;
399
+ case "minute2":
400
+ result += pad(value.getMinutes(), 2);
401
+ break;
402
+ case "second":
403
+ result += value.getSeconds().toString();
404
+ break;
405
+ case "second2":
406
+ result += pad(value.getSeconds(), 2);
407
+ break;
408
+ case "fraction": {
409
+ const ms = pad(value.getMilliseconds(), 3);
410
+ result += (ms + "0000000").slice(0, element.len ?? 3);
411
+ break;
412
+ }
413
+ case "fractionTrim": {
414
+ const ms = pad(value.getMilliseconds(), 3);
415
+ result += (ms + "0000000")
416
+ .slice(0, element.len ?? 3)
417
+ .replace(/0+$/, "");
418
+ break;
419
+ }
420
+ case "amPm1":
421
+ result += hour < 12 ? "A" : "P";
422
+ break;
423
+ case "amPm2":
424
+ result += hour < 12 ? "AM" : "PM";
425
+ break;
426
+ case "dateSep":
427
+ result += this.localeSettings.dateSeparator;
428
+ break;
429
+ case "timeSep":
430
+ result += this.localeSettings.timeSeparator;
431
+ break;
432
+ case "literal":
433
+ result += element.text ?? "";
434
+ break;
435
+ case "standard":
436
+ result += formatStandard(element.text ?? "", value, this.localeSettings.name);
437
+ break;
438
+ }
439
+ }
440
+ return result;
441
+ }
442
+ tryFromString(strValue) {
443
+ let parseText = strValue;
444
+ if (this.styles.has(DotNetDateTimeStyleId.AllowLeadingWhite) &&
445
+ this.styles.has(DotNetDateTimeStyleId.AllowTrailingWhite)) {
446
+ parseText = parseText.trim();
447
+ }
448
+ else if (this.styles.has(DotNetDateTimeStyleId.AllowLeadingWhite)) {
449
+ parseText = parseText.trimStart();
450
+ }
451
+ else if (this.styles.has(DotNetDateTimeStyleId.AllowTrailingWhite)) {
452
+ parseText = parseText.trimEnd();
453
+ }
454
+ if (parseText.length === 0) {
455
+ return new Err("DateTime string is empty");
456
+ }
457
+ if (this.formatIsStandard) {
458
+ const parsed = new Date(parseText);
459
+ if (Number.isNaN(parsed.getTime())) {
460
+ return new Err("Invalid Date string");
461
+ }
462
+ return new Ok(parsed);
463
+ }
464
+ const regexParts = ["^"];
465
+ const setters = [];
466
+ for (const element of this.elements) {
467
+ switch (element.type) {
468
+ case "day":
469
+ case "day2":
470
+ regexParts.push("(\\d{1,2})");
471
+ setters.push((v, s) => {
472
+ s.d = Number.parseInt(v, 10);
473
+ });
474
+ break;
475
+ case "month":
476
+ case "month2":
477
+ regexParts.push("(\\d{1,2})");
478
+ setters.push((v, s) => {
479
+ s.m = Number.parseInt(v, 10);
480
+ });
481
+ break;
482
+ case "year2":
483
+ regexParts.push("(\\d{1,2})");
484
+ setters.push((v, s) => {
485
+ const yr = Number.parseInt(v, 10);
486
+ s.y = yr < 50 ? 2000 + yr : 1900 + yr;
487
+ });
488
+ break;
489
+ case "year3":
490
+ case "year4":
491
+ case "year5":
492
+ regexParts.push("(\\d{3,5})");
493
+ setters.push((v, s) => {
494
+ s.y = Number.parseInt(v, 10);
495
+ });
496
+ break;
497
+ case "hour12":
498
+ case "hour12_2":
499
+ regexParts.push("(\\d{1,2})");
500
+ setters.push((v, s) => {
501
+ s.hh = Number.parseInt(v, 10);
502
+ });
503
+ break;
504
+ case "hour24":
505
+ case "hour24_2":
506
+ regexParts.push("(\\d{1,2})");
507
+ setters.push((v, s) => {
508
+ s.hh = Number.parseInt(v, 10);
509
+ });
510
+ break;
511
+ case "minute":
512
+ case "minute2":
513
+ regexParts.push("(\\d{1,2})");
514
+ setters.push((v, s) => {
515
+ s.mm = Number.parseInt(v, 10);
516
+ });
517
+ break;
518
+ case "second":
519
+ case "second2":
520
+ regexParts.push("(\\d{1,2})");
521
+ setters.push((v, s) => {
522
+ s.ss = Number.parseInt(v, 10);
523
+ });
524
+ break;
525
+ case "fraction":
526
+ case "fractionTrim":
527
+ regexParts.push("(\\d{1,7})");
528
+ setters.push((v, s) => {
529
+ s.ms = Number.parseInt((v + "000").slice(0, 3), 10);
530
+ });
531
+ break;
532
+ case "amPm1":
533
+ regexParts.push("([APap])");
534
+ setters.push((v, s) => {
535
+ s.ampm = v.toUpperCase() === "P" ? 2 : 1;
536
+ });
537
+ break;
538
+ case "amPm2":
539
+ regexParts.push("(AM|PM|am|pm)");
540
+ setters.push((v, s) => {
541
+ s.ampm = v.toUpperCase() === "PM" ? 2 : 1;
542
+ });
543
+ break;
544
+ case "dayNameShort":
545
+ regexParts.push(`(${dayNamesShort.join("|")})`);
546
+ setters.push(() => undefined);
547
+ break;
548
+ case "dayNameLong":
549
+ regexParts.push(`(${dayNamesLong.join("|")})`);
550
+ setters.push(() => undefined);
551
+ break;
552
+ case "monthNameShort":
553
+ regexParts.push(`(${monthNamesShort.join("|")})`);
554
+ setters.push((v, s) => {
555
+ s.m =
556
+ monthNamesShort.findIndex((x) => x.toLowerCase() === v.toLowerCase()) + 1;
557
+ });
558
+ break;
559
+ case "monthNameLong":
560
+ regexParts.push(`(${monthNamesLong.join("|")})`);
561
+ setters.push((v, s) => {
562
+ s.m =
563
+ monthNamesLong.findIndex((x) => x.toLowerCase() === v.toLowerCase()) + 1;
564
+ });
565
+ break;
566
+ case "dateSep":
567
+ regexParts.push(this.localeSettings.dateSeparator.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
568
+ break;
569
+ case "timeSep":
570
+ regexParts.push(this.localeSettings.timeSeparator.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
571
+ break;
572
+ case "literal":
573
+ regexParts.push((element.text ?? "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
574
+ break;
575
+ case "standard":
576
+ break;
577
+ }
578
+ }
579
+ regexParts.push("$");
580
+ const re = new RegExp(regexParts.join(""));
581
+ const match = re.exec(parseText);
582
+ if (match === null) {
583
+ return new Err("DateTime string does not match all Format specifiers");
584
+ }
585
+ const state = { y: 1, m: 1, d: 1, hh: 0, mm: 0, ss: 0, ms: 0, ampm: 0 };
586
+ let group = 1;
587
+ for (const setter of setters) {
588
+ setter(match[group], state);
589
+ group += 1;
590
+ }
591
+ if (state.ampm > 0) {
592
+ if (state.hh === 12)
593
+ state.hh = 0;
594
+ if (state.ampm === 2)
595
+ state.hh += 12;
596
+ }
597
+ const value = new Date(state.y, state.m - 1, state.d, state.hh, state.mm, state.ss, state.ms);
598
+ if (Number.isNaN(value.getTime())) {
599
+ return new Err("Year, Month or Day is invalid");
600
+ }
601
+ return new Ok(value);
602
+ }
603
+ }
604
+ //# sourceMappingURL=datetime-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime-formatter.js","sourceRoot":"","sources":["../../src/code/datetime-formatter.ts"],"names":[],"mappings":"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"}