@fr0st/datetime 6.1.1 → 7.0.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.
package/Formats.md ADDED
@@ -0,0 +1,475 @@
1
+ <table>
2
+ <thead>
3
+ <tr>
4
+ <td>Pattern</td>
5
+ <td>Example</td>
6
+ <td>Description</td>
7
+ </tr>
8
+ </thead>
9
+ <tbody>
10
+ <tr>
11
+ <td colspan="3"><strong>Era</strong></td>
12
+ </tr>
13
+ <tr>
14
+ <td><code>G..GGG</code></td>
15
+ <td><em>AD</em></td>
16
+ <td>Era (short)</td>
17
+ </tr>
18
+ <tr>
19
+ <td><code>GGGG</code></td>
20
+ <td><em>Anno Domini</em></td>
21
+ <td>Era (long)</td>
22
+ </tr>
23
+ <tr>
24
+ <td><code>GGGGG</code></td>
25
+ <td><em>A</em></td>
26
+ <td>Era (narrow)</td>
27
+ </tr>
28
+ <tr>
29
+ <td colspan="3"><strong>Year</strong></td>
30
+ </tr>
31
+ <tr>
32
+ <td><code>y</code></td>
33
+ <td><em>2, 20, 201, 2017</em></td>
34
+ <td rowspan="4">
35
+ Calendar year<br />
36
+ Zero padded to pattern length.<br />
37
+ The <code>yy</code> format will always use the 2 low-order digits of the year.
38
+ </td>
39
+ </tr>
40
+ <tr>
41
+ <td><code>yy</code></td>
42
+ <td><em>02, 20, 01, 17</em></td>
43
+ </tr>
44
+ <tr>
45
+ <td><code>yyy</code></td>
46
+ <td><em>002, 020, 201, 2017</em></td>
47
+ </tr>
48
+ <tr>
49
+ <td><code>yyyy+</code></td>
50
+ <td><em>0002, 0020, 0201, 2017</em></td>
51
+ </tr>
52
+ <tr>
53
+ <td><code>Y</code></td>
54
+ <td><em>2, 20, 201, 2017</em></td>
55
+ <td rowspan="4">
56
+ Week year<br />
57
+ Zero padded to pattern length.<br />
58
+ The <code>YY</code> format will always use the 2 low-order digits of the year.
59
+ </td>
60
+ </tr>
61
+ <tr>
62
+ <td><code>YY</code></td>
63
+ <td><em>02, 20, 01, 17</em></td>
64
+ </tr>
65
+ <tr>
66
+ <td><code>YYY</code></td>
67
+ <td><em>002, 020, 201, 2017</em></td>
68
+ </tr>
69
+ <tr>
70
+ <td><code>YYYY+</code></td>
71
+ <td><em>0002, 0020, 0201, 2017</em></td>
72
+ </tr>
73
+ <tr>
74
+ <td colspan="3"><strong>Quarter</strong></td>
75
+ </tr>
76
+ <tr>
77
+ <td><code>q</code></td>
78
+ <td><em>2</em></td>
79
+ <td>Quarter</td>
80
+ </tr>
81
+ <tr>
82
+ <td><code>qq</code></td>
83
+ <td><em>02</em></td>
84
+ <td>Quarter (2-digits)</td>
85
+ </tr>
86
+ <tr>
87
+ <td><code>Q</code></td>
88
+ <td><em>2</em></td>
89
+ <td><strong>Standalone</strong> Quarter</td>
90
+ </tr>
91
+ <tr>
92
+ <td><code>QQ</code></td>
93
+ <td><em>02</em></td>
94
+ <td><strong>Standalone</strong> Quarter (2-digits)</td>
95
+ </tr>
96
+ <tr>
97
+ <td colspan="3"><strong>Month</strong></td>
98
+ </tr>
99
+ <tr>
100
+ <td><code>M</code></td>
101
+ <td><em>9, 12</em></td>
102
+ <td>Month number</td>
103
+ </tr>
104
+ <tr>
105
+ <td><code>MM</code></td>
106
+ <td><em>09, 12</em></td>
107
+ <td>Month number (2-digits)</td>
108
+ </tr>
109
+ <tr>
110
+ <td><code>MMM</code></td>
111
+ <td><em>Sep</em></td>
112
+ <td>Month name (short)</td>
113
+ </tr>
114
+ <tr>
115
+ <td><code>MMMM</code></td>
116
+ <td><em>September</em></td>
117
+ <td>Month name (long)</td>
118
+ </tr>
119
+ <tr>
120
+ <td><code>MMMMM</code></td>
121
+ <td><em>S</em></td>
122
+ <td>Month name (narrow, output only)</td>
123
+ </tr>
124
+ <tr>
125
+ <td><code>L</code></td>
126
+ <td><em>9, 12</em></td>
127
+ <td><strong>Standalone</strong> Month number</td>
128
+ </tr>
129
+ <tr>
130
+ <td><code>LL</code></td>
131
+ <td><em>09, 12</em></td>
132
+ <td><strong>Standalone</strong> Month number (2-digits)</td>
133
+ </tr>
134
+ <tr>
135
+ <td><code>LLL</code></td>
136
+ <td><em>Sep</em></td>
137
+ <td><strong>Standalone</strong> Month name (short)</td>
138
+ </tr>
139
+ <tr>
140
+ <td><code>LLLL</code></td>
141
+ <td><em>September</em></td>
142
+ <td><strong>Standalone</strong> Month name (long)</td>
143
+ </tr>
144
+ <tr>
145
+ <td><code>LLLLL</code></td>
146
+ <td><em>S</em></td>
147
+ <td><strong>Standalone</strong> Month name (narrow, output only)</td>
148
+ </tr>
149
+ <tr>
150
+ <td colspan="3"><strong>Week</strong></td>
151
+ </tr>
152
+ <tr>
153
+ <td><code>w</code></td>
154
+ <td><em>8, 27</em></td>
155
+ <td>Week of year</td>
156
+ </tr>
157
+ <tr>
158
+ <td><code>ww</code></td>
159
+ <td><em>08, 27</em></td>
160
+ <td>Week of year (2-digits)</td>
161
+ </tr>
162
+ <tr>
163
+ <td><code>W</code></td>
164
+ <td><em>3</em></td>
165
+ <td>Week of month.</td>
166
+ </tr>
167
+ <tr>
168
+ <td colspan="3"><strong>Day</strong></td>
169
+ </tr>
170
+ <tr>
171
+ <td><code>d</code></td>
172
+ <td><em>1</em></td>
173
+ <td>Day of month</td>
174
+ </tr>
175
+ <tr>
176
+ <td><code>dd</code></td>
177
+ <td><em>01</em></td>
178
+ <td>Day of month (2-digits)</td>
179
+ </tr>
180
+ <tr>
181
+ <td><code>D..DDD</code></td>
182
+ <td><em>345</em></td>
183
+ <td>
184
+ Day of year<br />
185
+ Zero padded to pattern length.
186
+ </td>
187
+ </tr>
188
+ <tr>
189
+ <td><code>F</code></td>
190
+ <td><em>2</em></td>
191
+ <td>Day of week in month</td>
192
+ </tr>
193
+ <tr>
194
+ <td colspan="3"><strong>Week Day</strong></td>
195
+ </tr>
196
+ <tr>
197
+ <td><code>E..EEE</code></td>
198
+ <td><em>Tue</em></td>
199
+ <td>Day of week name (short)</td>
200
+ </tr>
201
+ <tr>
202
+ <td><code>EEEE</code></td>
203
+ <td><em>Tuesday</em></td>
204
+ <td>Day of week name (long)</td>
205
+ </tr>
206
+ <tr>
207
+ <td><code>EEEEE</code></td>
208
+ <td><em>T</em></td>
209
+ <td>Day of week name (narrow)</td>
210
+ </tr>
211
+ <tr>
212
+ <td><code>e</code></td>
213
+ <td><em>2</em></td>
214
+ <td>Day of week number</td>
215
+ </tr>
216
+ <tr>
217
+ <td><code>ee</code></td>
218
+ <td><em>02</em></td>
219
+ <td>Day of week number (2-digits)</td>
220
+ </tr>
221
+ <tr>
222
+ <td><code>eee</code></td>
223
+ <td><em>Tue</em></td>
224
+ <td>Day of week name (short)</td>
225
+ </tr>
226
+ <tr>
227
+ <td><code>eeee</code></td>
228
+ <td><em>Tuesday</em></td>
229
+ <td>Day of week name (long)</td>
230
+ </tr>
231
+ <tr>
232
+ <td><code>eeeee</code></td>
233
+ <td><em>T</em></td>
234
+ <td>Day of week name (narrow)</td>
235
+ </tr>
236
+ <tr>
237
+ <td><code>c</code></td>
238
+ <td><em>2</em></td>
239
+ <td><strong>Standalone</strong> Day of week number</td>
240
+ </tr>
241
+ <tr>
242
+ <td><code>cc</code></td>
243
+ <td><em>2</em></td>
244
+ <td><strong>Standalone</strong> Day of week number (same output as <code>c</code>)</td>
245
+ </tr>
246
+ <tr>
247
+ <td><code>ccc</code></td>
248
+ <td><em>Tue</em></td>
249
+ <td><strong>Standalone</strong> Day of week name (short)</td>
250
+ </tr>
251
+ <tr>
252
+ <td><code>cccc</code></td>
253
+ <td><em>Tuesday</em></td>
254
+ <td><strong>Standalone</strong> Day of week name (long)</td>
255
+ </tr>
256
+ <tr>
257
+ <td><code>ccccc</code></td>
258
+ <td><em>T</em></td>
259
+ <td><strong>Standalone</strong> Day of week name (narrow)</td>
260
+ </tr>
261
+ <tr>
262
+ <td colspan="3"><strong>Day Period</strong></td>
263
+ </tr>
264
+ <tr>
265
+ <td><code>a..aaa</code></td>
266
+ <td><em>AM</em></td>
267
+ <td>Day period (short)</td>
268
+ </tr>
269
+ <tr>
270
+ <td><code>aaaa</code></td>
271
+ <td><em>AM</em></td>
272
+ <td>Day period (long)</td>
273
+ </tr>
274
+ <!-- <tr>
275
+ <td><code>aaaaa</code></td>
276
+ <td><em>a</em></td>
277
+ <td>Day period (narrow)</td>
278
+ </tr> -->
279
+ <tr>
280
+ <td colspan="3"><strong>Hour</strong></td>
281
+ </tr>
282
+ <tr>
283
+ <td><code>h</code></td>
284
+ <td><em>1, 12</em></td>
285
+ <td>Hour [1-12]</td>
286
+ </tr>
287
+ <tr>
288
+ <td><code>hh</code></td>
289
+ <td><em>01, 12</em></td>
290
+ <td>Hour [1-12] (2-digits)</td>
291
+ </tr>
292
+ <tr>
293
+ <td><code>H</code></td>
294
+ <td><em>0, 23</em></td>
295
+ <td>Hour [0-23]</td>
296
+ </tr>
297
+ <tr>
298
+ <td><code>HH</code></td>
299
+ <td><em>00, 23</em></td>
300
+ <td>Hour [0-23] (2-digits)</td>
301
+ </tr>
302
+ <tr>
303
+ <td><code>K</code></td>
304
+ <td><em>0, 11</em></td>
305
+ <td>Hour [0-11]</td>
306
+ </tr>
307
+ <tr>
308
+ <td><code>KK</code></td>
309
+ <td><em>00, 11</em></td>
310
+ <td>Hour [0-11] (2-digits)</td>
311
+ </tr>
312
+ <tr>
313
+ <td><code>k</code></td>
314
+ <td><em>1, 24</em></td>
315
+ <td>Hour [1-24]</td>
316
+ </tr>
317
+ <tr>
318
+ <td><code>kk</code></td>
319
+ <td><em>01, 24</em></td>
320
+ <td>Hour [1-24] (2-digits)</td>
321
+ </tr>
322
+ <tr>
323
+ <td colspan="3"><strong>Minute</strong></td>
324
+ </tr>
325
+ <tr>
326
+ <td><code>m</code></td>
327
+ <td><em>8, 59</em></td>
328
+ <td>Minute</td>
329
+ </tr>
330
+ <tr>
331
+ <td><code>mm</code></td>
332
+ <td><em>08, 59</em></td>
333
+ <td>Minute (2-digits)</td>
334
+ </tr>
335
+ <tr>
336
+ <td colspan="3"><strong>Second</strong></td>
337
+ </tr>
338
+ <tr>
339
+ <td><code>s</code></td>
340
+ <td><em>8, 12</em></td>
341
+ <td>Second</td>
342
+ </tr>
343
+ <tr>
344
+ <td><code>ss</code></td>
345
+ <td><em>08, 12</em></td>
346
+ <td>Second (2-digits)</td>
347
+ </tr>
348
+ <tr>
349
+ <td><code>S+</code></td>
350
+ <td><em>3, 34, 345, 3450</em></td>
351
+ <td>
352
+ Fractional second with millisecond precision.<br />
353
+ Formatting truncates widths 1–3 and pads wider patterns with trailing zeroes; parsing ignores precision beyond milliseconds.
354
+ </td>
355
+ </tr>
356
+ <tr>
357
+ <td colspan="3"><strong>Time Zone</strong></td>
358
+ </tr>
359
+ <tr>
360
+ <td><code>z..zzz</code></td>
361
+ <td><em>PDT</em></td>
362
+ <td>Short specific non-location format*</td>
363
+ </tr>
364
+ <tr>
365
+ <td><code>zzzz</code></td>
366
+ <td><em>Pacific Daylight Time</em></td>
367
+ <td>Long specific non-location format*</td>
368
+ </tr>
369
+ <tr>
370
+ <td><code>Z..ZZZ</code></td>
371
+ <td><em>-0800</em></td>
372
+ <td>ISO8601 basic format</td>
373
+ </tr>
374
+ <tr>
375
+ <td><code>ZZZZ</code></td>
376
+ <td><em>GMT-08:00</em></td>
377
+ <td>Long localized GMT format</td>
378
+ </tr>
379
+ <tr>
380
+ <td><code>ZZZZZ</code></td>
381
+ <td><em>-08:00, +00:09:21, Z</em></td>
382
+ <td>ISO8601 extended format (optional seconds)</td>
383
+ </tr>
384
+ <tr>
385
+ <td><code>O</code></td>
386
+ <td><em>GMT-08</em></td>
387
+ <td>Short localized GMT format</td>
388
+ </tr>
389
+ <tr>
390
+ <td><code>OOOO</code></td>
391
+ <td><em>GMT-08:00</em></td>
392
+ <td>Long localized GMT format</td>
393
+ </tr>
394
+ <tr>
395
+ <td><code>VV</code></td>
396
+ <td><em>America/Los_Angeles</em></td>
397
+ <td>Long time zone ID</td>
398
+ </tr>
399
+ <tr>
400
+ <td><code>X</code></td>
401
+ <td><em>-08, +0530, Z</em></td>
402
+ <td>ISO8601 basic format with Z (optional minutes)</td>
403
+ </tr>
404
+ <tr>
405
+ <td><code>XX</code></td>
406
+ <td><em>-0800, Z</em></td>
407
+ <td>ISO8601 basic format with Z</td>
408
+ </tr>
409
+ <tr>
410
+ <td><code>XXX</code></td>
411
+ <td><em>-08:00, Z</em></td>
412
+ <td>ISO8601 extended format with Z</td>
413
+ </tr>
414
+ <tr>
415
+ <td><code>XXXX</code></td>
416
+ <td><em>-0800, +000921, Z</em></td>
417
+ <td>ISO8601 basic format with Z (optional seconds)</td>
418
+ </tr>
419
+ <tr>
420
+ <td><code>XXXXX</code></td>
421
+ <td><em>-08:00, +00:09:21, Z</em></td>
422
+ <td>ISO8601 extended format with Z (optional seconds)</td>
423
+ </tr>
424
+ <tr>
425
+ <td><code>x</code></td>
426
+ <td><em>-08, +0530, +00</em></td>
427
+ <td>ISO8601 basic format (optional minutes)</td>
428
+ </tr>
429
+ <tr>
430
+ <td><code>xx</code></td>
431
+ <td><em>-0800, +0000</em></td>
432
+ <td>ISO8601 basic format</td>
433
+ </tr>
434
+ <tr>
435
+ <td><code>xxx</code></td>
436
+ <td><em>-08:00, +00:00</em></td>
437
+ <td>ISO8601 extended format</td>
438
+ </tr>
439
+ <tr>
440
+ <td><code>xxxx</code></td>
441
+ <td><em>-0800, +000921, +0000</em></td>
442
+ <td>ISO8601 basic format (optional seconds)</td>
443
+ </tr>
444
+ <tr>
445
+ <td><code>xxxxx</code></td>
446
+ <td><em>-08:00, +00:09:21, +00:00</em></td>
447
+ <td>ISO8601 extended format (optional seconds)</td>
448
+ </tr>
449
+ </tbody>
450
+ </table>
451
+ <p><em>* Output only</em></p>
452
+ <p><strong>Narrow month and weekday names are output only. See the compatibility matrix below for intentionally unsupported widths.</strong></p>
453
+ <p><strong>Characters wrapped in <code>'</code> quotes are treated as literal text. A doubled apostrophe (<code>''</code>) represents one literal apostrophe during formatting and parsing, including inside quoted text: <code>yyyy 'o''clock'</code> → <code>2019 o'clock</code>.</strong></p>
454
+ <p><strong>Numeric date and time fields use the active locale's numbering system during formatting and parsing, including non-BMP digits when supported by the runtime.</strong></p>
455
+
456
+ ## PHP `IntlDateFormatter` token-width compatibility
457
+
458
+ The expected PHP behavior was recorded with PHP 8.5.9 and ICU 70.1 using the Gregorian calendar. “Equivalent” describes the pattern-width behavior; localized names can still vary with the ICU data installed in each runtime.
459
+
460
+ | Tokens | Supported widths | Status and PHP behavior |
461
+ |---|---|---|
462
+ | `G` | All | Equivalent: widths 1–3 and 6+ are abbreviated, 4 is long, and 5 is narrow. |
463
+ | `y`, `Y` | All | Equivalent: `yy` uses the two low-order digits; other widths set minimum numeric padding, such as `yyyyy` → `02018`. |
464
+ | `Q`, `q` | 1–2 and 5+ | Equivalent numeric and narrow/fallback forms. Widths 3–4 are intentionally unsupported because PHP uses localized quarter forms such as `Q2` and `2nd quarter`, which JavaScript `Intl` does not expose. |
465
+ | `M`, `L` | All for formatting; all except 5 for parsing | Equivalent: widths 3–5 are abbreviated, long, and narrow names; widths 6+ return to padded numbers, such as `MMMMMM` → `000006`. Narrow names are output only because they are not reliably unique. |
466
+ | `w`, `W`, `d`, `D`, `F` | All | Equivalent numeric padding, such as `www` → `022` and `dddd` → `0001`. |
467
+ | `E`, `e`, `c` | All except 6; width 5 is output only | Widths 1–5 and 7+ are equivalent. Width 6 is intentionally unsupported because PHP uses a distinct short form such as `EEEEEE` → `Fr`, which JavaScript `Intl` does not expose. Narrow names are output only because they are not reliably unique. |
468
+ | `a` | 1–4 | Equivalent for abbreviated and long day periods. Widths 5+ are intentionally unsupported because PHP uses narrow values such as `p`, which JavaScript `Intl` does not reliably expose. |
469
+ | `h`, `H`, `K`, `k`, `m`, `s` | All | Equivalent numeric padding. |
470
+ | `S` | All | Supported with millisecond precision: formatting pads beyond three digits with zeroes and parsing truncates additional precision. |
471
+ | `z` | All, output only | Equivalent width selection: widths 1–3 are short and 4+ are long. The exact name depends on runtime ICU data. |
472
+ | `Z` | All | Equivalent: widths 1–3 are basic offsets, 4 and 6+ are localized GMT, and 5 is an extended ISO offset. |
473
+ | `O` | 1 and 4 | Width 4 is equivalent. Width 1 uses a two-digit hour (`GMT-04`) instead of PHP’s `GMT-4`; other widths are intentionally unsupported. |
474
+ | `V` | 2 | Equivalent IANA time-zone ID. PHP’s short ID, exemplar city, and generic location widths are intentionally unsupported. |
475
+ | `X`, `x` | 1–5 | Equivalent ISO offset widths. Widths 6+ are intentionally unsupported. |
package/LICENSE CHANGED
File without changes