Passed
Push — master ( 5e44c4...8c6c38 )
by Alexey
03:59 queued 11s
created

DateStringFormatter::convertFarsiNumbers()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 6
ccs 5
cts 5
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
/** @noinspection PhpUnusedPrivateMethodInspection */
4
declare(strict_types=1);
5
6
/**
7
 * @author   Ne-Lexa
8
 * @license  MIT
9
 *
10
 * @see      https://github.com/Ne-Lexa/google-play-scraper
11
 */
12
13
namespace Nelexa\GPlay\Util;
14
15
/**
16
 * The class for converting a localized date to the \DateTimeInterface.
17
 * It would be possible to use the php-intl library, but its different
18
 * versions give different results.
19
 *
20
 * @internal
21
 */
22
class DateStringFormatter
23
{
24
    private const MEDIUM_DATE_PATTERNS = [
25
        'af' => [
26
            'pattern' => '~^(?P<day>\d+)\s(?P<month>.*?)\s(?P<year>\d{4})$~',
27
            'months' => [
28
                'Jan.' => 1,
29
                'Feb.' => 2,
30
                'Mrt.' => 3,
31
                'Apr.' => 4,
32
                'Mei' => 5,
33
                'Jun.' => 6,
34
                'Jul.' => 7,
35
                'Aug.' => 8,
36
                'Sep.' => 9,
37
                'Okt.' => 10,
38
                'Nov.' => 11,
39
                'Des.' => 12,
40
            ],
41
        ],
42
        'am' => [
43
            'pattern' => '~^(?P<day>\d+)\s(?P<month>.*?)\s(?P<year>\d{4})~',
44
            'months' => [
45
                'ጃንዩ' => 1,
46
                'ፌብሩ' => 2,
47
                'ማርች' => 3,
48
                'ኤፕሪ' => 4,
49
                'ሜይ' => 5,
50
                'ጁን' => 6,
51
                'ጁላይ' => 7,
52
                'ኦገስ' => 8,
53
                'ሴፕቴ' => 9,
54
                'ኦክቶ' => 10,
55
                'ኖቬም' => 11,
56
                'ዲሴም' => 12,
57
            ],
58
        ],
59
        'ar' => [
60
            'pattern' => '~^(?P<day>\d{2})‏/(?P<month>\d{2})‏/(?P<year>\d{4})$~',
61
        ],
62
        'az_AZ' => [
63
            'pattern' => '~^(?P<day>\d+)\s(?P<month>.*?)\s(?P<year>\d{4})~',
64
            'months' => [
65
                'yan' => 1,
66
                'fev' => 2,
67
                'mar' => 3,
68
                'apr' => 4,
69
                'may' => 5,
70
                'iyn' => 6,
71
                'iyl' => 7,
72
                'avq' => 8,
73
                'sen' => 9,
74
                'okt' => 10,
75
                'noy' => 11,
76
                'dek' => 12,
77
            ],
78
        ],
79
        'be' => [
80
            'pattern' => '~^(?P<day>\d{1,2})\.(?P<month>\d{2})\.(?P<year>\d{4})$~',
81
        ],
82
        'bg' => [
83
            'pattern' => '~^(?P<day>\d{1,2})\.(?P<month>\d{2})\.(?P<year>\d{4}) г.$~',
84
        ],
85
        'bn_BD' => [
86
            'pattern' => '~^(?P<day>\d+)\s(?P<month>.*?),\s(?P<year>\d{4})$~',
87
            'convert' => [__CLASS__, 'convertBengaliNumbers'],
88
            'months' => [
89
                'জানু' => 1,
90
                'ফেব' => 2,
91
                'মার্চ' => 3,
92
                'এপ্রিল' => 4,
93
                'মে' => 5,
94
                'জুন' => 6,
95
                'জুলাই' => 7,
96
                'আগস্ট' => 8,
97
                'সেপ্টেম্বর' => 9,
98
                'অক্টোবর' => 10,
99
                'নভেম্বর' => 11,
100
                'ডিসেম্বর' => 12,
101
            ],
102
        ],
103
        'ca' => [
104
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*)\s(?P<year>\d{4})$~',
105
            'months' => [
106
                'de gen.' => 1,
107
                'de febr.' => 2,
108
                'de març' => 3,
109
                'd’abr.' => 4,
110
                'de maig' => 5,
111
                'de juny' => 6,
112
                'de jul.' => 7,
113
                'd’ag.' => 8,
114
                'de set.' => 9,
115
                'd’oct.' => 10,
116
                'de nov.' => 11,
117
                'de des.' => 12,
118
            ],
119
        ],
120
        'cs_CZ' => [
121
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>\d{1,2})\.\s(?P<year>\d{4})$~',
122
        ],
123
        'da_DK' => [
124
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>.*?)\s(?P<year>\d{4})$~',
125
            'months' => [
126
                'jan.' => 1,
127
                'feb.' => 2,
128
                'mar.' => 3,
129
                'apr.' => 4,
130
                'maj' => 5,
131
                'jun.' => 6,
132
                'jul.' => 7,
133
                'aug.' => 8,
134
                'sep.' => 9,
135
                'okt.' => 10,
136
                'nov.' => 11,
137
                'dec.' => 12,
138
            ],
139
        ],
140
        'de_DE' => [
141
            'pattern' => '~^(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{4})$~',
142
        ],
143
        'el_GR' => [
144
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
145
            'months' => [
146
                'Ιαν' => 1,
147
                'Φεβ' => 2,
148
                'Μαρ' => 3,
149
                'Απρ' => 4,
150
                'Μαΐ' => 5,
151
                'Ιουν' => 6,
152
                'Ιουλ' => 7,
153
                'Αυγ' => 8,
154
                'Σεπ' => 9,
155
                'Οκτ' => 10,
156
                'Νοε' => 11,
157
                'Δεκ' => 12,
158
            ],
159
        ],
160
        'en_AU' => [
161
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
162
            'months' => [
163
                'Jan' => 1,
164
                'Feb' => 2,
165
                'Mar' => 3,
166
                'Apr' => 4,
167
                'May' => 5,
168
                'Jun' => 6,
169
                'Jul' => 7,
170
                'Aug' => 8,
171
                'Sep' => 9,
172
                'Oct' => 10,
173
                'Nov' => 11,
174
                'Dec' => 12,
175
            ],
176
        ],
177
        'en_CA' => [
178
            'pattern' => '~^(?P<month>.*?)\s(?P<day>\d{1,2}),\s(?P<year>\d{4})$~',
179
            'months' => [
180
                'Jan.' => 1,
181
                'Feb.' => 2,
182
                'Mar.' => 3,
183
                'Apr.' => 4,
184
                'May' => 5,
185
                'Jun.' => 6,
186
                'Jul.' => 7,
187
                'Aug.' => 8,
188
                'Sep.' => 9,
189
                'Oct.' => 10,
190
                'Nov.' => 11,
191
                'Dec.' => 12,
192
            ],
193
        ],
194
        'en_GB' => [
195
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
196
            'months' => [
197
                'Jan' => 1,
198
                'Feb' => 2,
199
                'Mar' => 3,
200
                'Apr' => 4,
201
                'May' => 5,
202
                'Jun' => 6,
203
                'Jul' => 7,
204
                'Aug' => 8,
205
                'Sep' => 9,
206
                'Oct' => 10,
207
                'Nov' => 11,
208
                'Dec' => 12,
209
            ],
210
        ],
211
        'en_IN' => [
212
            'pattern' => '~^(?P<day>\d{1,2})-(?P<month>.*?)-(?P<year>\d{4})$~',
213
            'months' => [
214
                'Jan' => 1,
215
                'Feb' => 2,
216
                'Mar' => 3,
217
                'Apr' => 4,
218
                'May' => 5,
219
                'Jun' => 6,
220
                'Jul' => 7,
221
                'Aug' => 8,
222
                'Sep' => 9,
223
                'Oct' => 10,
224
                'Nov' => 11,
225
                'Dec' => 12,
226
            ],
227
        ],
228
        'en_SG' => [
229
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
230
            'months' => [
231
                'Jan' => 1,
232
                'Feb' => 2,
233
                'Mar' => 3,
234
                'Apr' => 4,
235
                'May' => 5,
236
                'Jun' => 6,
237
                'Jul' => 7,
238
                'Aug' => 8,
239
                'Sep' => 9,
240
                'Oct' => 10,
241
                'Nov' => 11,
242
                'Dec' => 12,
243
            ],
244
        ],
245
        'en_US' => [
246
            'pattern' => '~^(?P<month>.*?)\s(?P<day>\d{1,2}),\s(?P<year>\d{4})$~',
247
            'months' => [
248
                'Jan' => 1,
249
                'Feb' => 2,
250
                'Mar' => 3,
251
                'Apr' => 4,
252
                'May' => 5,
253
                'Jun' => 6,
254
                'Jul' => 7,
255
                'Aug' => 8,
256
                'Sep' => 9,
257
                'Oct' => 10,
258
                'Nov' => 11,
259
                'Dec' => 12,
260
            ],
261
        ],
262
        'en_ZA' => [
263
            'pattern' => '~^(?P<day>\d{2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
264
            'months' => [
265
                'Jan' => 1,
266
                'Feb' => 2,
267
                'Mar' => 3,
268
                'Apr' => 4,
269
                'May' => 5,
270
                'Jun' => 6,
271
                'Jul' => 7,
272
                'Aug' => 8,
273
                'Sep' => 9,
274
                'Oct' => 10,
275
                'Nov' => 11,
276
                'Dec' => 12,
277
            ],
278
        ],
279
        'es_419' => [
280
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\.\s(?P<year>\d{4})$~',
281
            'months' => [
282
                'ene' => 1,
283
                'feb' => 2,
284
                'mar' => 3,
285
                'abr' => 4,
286
                'may' => 5,
287
                'jun' => 6,
288
                'jul' => 7,
289
                'ago' => 8,
290
                'sep' => 9,
291
                'oct' => 10,
292
                'nov' => 11,
293
                'dic' => 12,
294
            ],
295
        ],
296
        'es_ES' => [
297
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\.\s(?P<year>\d{4})$~',
298
            'months' => [
299
                'ene' => 1,
300
                'feb' => 2,
301
                'mar' => 3,
302
                'abr' => 4,
303
                'may' => 5,
304
                'jun' => 6,
305
                'jul' => 7,
306
                'ago' => 8,
307
                'sept' => 9,
308
                'oct' => 10,
309
                'nov' => 11,
310
                'dic' => 12,
311
            ],
312
        ],
313
        'es_US' => [
314
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\.\s(?P<year>\d{4})$~',
315
            'months' => [
316
                'ene' => 1,
317
                'feb' => 2,
318
                'mar' => 3,
319
                'abr' => 4,
320
                'may' => 5,
321
                'jun' => 6,
322
                'jul' => 7,
323
                'ago' => 8,
324
                'sep' => 9,
325
                'oct' => 10,
326
                'nov' => 11,
327
                'dic' => 12,
328
            ],
329
        ],
330
        'et' => [
331
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>.*?)\s(?P<year>\d{4})$~',
332
            'months' => [
333
                'jaan' => 1,
334
                'veebr' => 2,
335
                'märts' => 3,
336
                'apr' => 4,
337
                'mai' => 5,
338
                'juuni' => 6,
339
                'juuli' => 7,
340
                'aug' => 8,
341
                'sept' => 9,
342
                'okt' => 10,
343
                'nov' => 11,
344
                'dets' => 12,
345
            ],
346
        ],
347
        'eu_ES' => [
348
            'pattern' => '~^(?P<year>\d{4})\(e\)ko (?P<month>.*?)\.\s(?P<day>\d{1,2})\(a\)$~',
349
            'months' => [
350
                'urt' => 1,
351
                'ots' => 2,
352
                'mar' => 3,
353
                'api' => 4,
354
                'mai' => 5,
355
                'eka' => 6,
356
                'uzt' => 7,
357
                'abu' => 8,
358
                'ira' => 9,
359
                'urr' => 10,
360
                'aza' => 11,
361
                'abe' => 12,
362
            ],
363
        ],
364
        'fa' => [
365
            'pattern' => '~^(?P<day>\d+)\s(?P<month>.*?)\s(?P<year>\d{4})$~',
366
            'convert' => [__CLASS__, 'convertFarsiNumbers'],
367
            'convertCalendar' => [__CLASS__, 'convertPersianToGregorianCalendar'],
368
            'months' => [
369
                'فروردین' => 1,
370
                'اردیبهشت' => 2,
371
                'خرداد' => 3,
372
                'تیر' => 4,
373
                'مرداد' => 5,
374
                'شهریور' => 6,
375
                'مهر' => 7,
376
                'آبان' => 8,
377
                'آذر' => 9,
378
                'دی' => 10,
379
                'بهمن' => 11,
380
                'اسفند' => 12,
381
            ],
382
        ],
383
        'fi_FI' => [
384
            'pattern' => '~^(?P<day>\d{1,2})\.(?P<month>\d{1,2})\.(?P<year>\d{4})$~',
385
        ],
386
        'fil' => [
387
            'pattern' => '~^(?P<month>\w+)\s(?P<day>\d{1,2}),\s(?P<year>\d{4})$~',
388
            'months' => [
389
                'Ene' => 1,
390
                'Peb' => 2,
391
                'Mar' => 3,
392
                'Abr' => 4,
393
                'May' => 5,
394
                'Hun' => 6,
395
                'Hul' => 7,
396
                'Ago' => 8,
397
                'Set' => 9,
398
                'Okt' => 10,
399
                'Nob' => 11,
400
                'Dis' => 12,
401
            ],
402
        ],
403
        'fr_CA' => [
404
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
405
            'months' => [
406
                'janv.' => 1,
407
                'févr.' => 2,
408
                'mars' => 3,
409
                'avr.' => 4,
410
                'mai' => 5,
411
                'juin' => 6,
412
                'juill.' => 7,
413
                'août' => 8,
414
                'sept.' => 9,
415
                'oct.' => 10,
416
                'nov.' => 11,
417
                'déc.' => 12,
418
            ],
419
        ],
420
        'fr_FR' => [
421
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
422
            'months' => [
423
                'janv.' => 1,
424
                'févr.' => 2,
425
                'mars' => 3,
426
                'avr.' => 4,
427
                'mai' => 5,
428
                'juin' => 6,
429
                'juil.' => 7,
430
                'août' => 8,
431
                'sept.' => 9,
432
                'oct.' => 10,
433
                'nov.' => 11,
434
                'déc.' => 12,
435
            ],
436
        ],
437
        'gl_ES' => [
438
            'pattern' => '~^(?P<day>\d{1,2})\sde\s(?P<month>.*?)\sde\s(?P<year>\d{4})$~',
439
            'months' => [
440
                'xan.' => 1,
441
                'feb.' => 2,
442
                'mar.' => 3,
443
                'abr.' => 4,
444
                'maio' => 5,
445
                'xuño' => 6,
446
                'xul.' => 7,
447
                'ago.' => 8,
448
                'set.' => 9,
449
                'out.' => 10,
450
                'nov.' => 11,
451
                'dec.' => 12,
452
            ],
453
        ],
454
        'hi_IN' => [
455
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
456
            'months' => [
457
                'जन॰' => 1,
458
                'फ़र॰' => 2,
459
                'मार्च' => 3,
460
                'अप्रैल' => 4,
461
                'मई' => 5,
462
                'जून' => 6,
463
                'जुल॰' => 7,
464
                'अग॰' => 8,
465
                'सित॰' => 9,
466
                'अक्तू॰' => 10,
467
                'नव॰' => 11,
468
                'दिस॰' => 12,
469
            ],
470
        ],
471
        'hr' => [
472
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>.*?)\s(?P<year>\d{4})\.$~',
473
            'months' => [
474
                'sij' => 1,
475
                'velj' => 2,
476
                'ožu' => 3,
477
                'tra' => 4,
478
                'svi' => 5,
479
                'lip' => 6,
480
                'srp' => 7,
481
                'kol' => 8,
482
                'ruj' => 9,
483
                'lis' => 10,
484
                'stu' => 11,
485
                'pro' => 12,
486
            ],
487
        ],
488
        'hu_HU' => [
489
            'pattern' => '~^(?P<year>\d{4})\.\s(?P<month>.*?)\.\s(?P<day>\d{1,2})\.$~',
490
            'months' => [
491
                'jan' => 1,
492
                'febr' => 2,
493
                'márc' => 3,
494
                'ápr' => 4,
495
                'máj' => 5,
496
                'jún' => 6,
497
                'júl' => 7,
498
                'aug' => 8,
499
                'szept' => 9,
500
                'okt' => 10,
501
                'nov' => 11,
502
                'dec' => 12,
503
            ],
504
        ],
505
        'hy_AM' => [
506
            'pattern' => '~^(?P<day>\d{2})\s(?P<month>.*?),\s(?P<year>\d{4})\sթ.$~',
507
            'months' => [
508
                'հնվ' => 1,
509
                'փտվ' => 2,
510
                'մրտ' => 3,
511
                'ապր' => 4,
512
                'մյս' => 5,
513
                'հնս' => 6,
514
                'հլս' => 7,
515
                'օգս' => 8,
516
                'սեպ' => 9,
517
                'հոկ' => 10,
518
                'նոյ' => 11,
519
                'դեկ' => 12,
520
            ],
521
        ],
522
        'id' => [
523
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
524
            'months' => [
525
                'Jan' => 1,
526
                'Feb' => 2,
527
                'Mar' => 3,
528
                'Apr' => 4,
529
                'Mei' => 5,
530
                'Jun' => 6,
531
                'Jul' => 7,
532
                'Agu' => 8,
533
                'Sep' => 9,
534
                'Okt' => 10,
535
                'Nov' => 11,
536
                'Des' => 12,
537
            ],
538
        ],
539
        'is_IS' => [
540
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>.*?)\s(?P<year>\d{4})$~',
541
            'months' => [
542
                'jan.' => 1,
543
                'feb.' => 2,
544
                'mar.' => 3,
545
                'apr.' => 4,
546
                'maí' => 5,
547
                'jún.' => 6,
548
                'júl.' => 7,
549
                'ágú.' => 8,
550
                'sep.' => 9,
551
                'okt.' => 10,
552
                'nóv.' => 11,
553
                'des.' => 12,
554
            ],
555
        ],
556
        'it_IT' => [
557
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
558
            'months' => [
559
                'gen' => 1,
560
                'feb' => 2,
561
                'mar' => 3,
562
                'apr' => 4,
563
                'mag' => 5,
564
                'giu' => 6,
565
                'lug' => 7,
566
                'ago' => 8,
567
                'set' => 9,
568
                'ott' => 10,
569
                'nov' => 11,
570
                'dic' => 12,
571
            ],
572
        ],
573
        'iw_IL' => [
574
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
575
            'months' => [
576
                'בינו׳' => 1,
577
                'בפבר׳' => 2,
578
                'במרץ' => 3,
579
                'באפר׳' => 4,
580
                'במאי' => 5,
581
                'ביוני' => 6,
582
                'ביולי' => 7,
583
                'באוג׳' => 8,
584
                'בספט׳' => 9,
585
                'באוק׳' => 10,
586
                'בנוב׳' => 11,
587
                'בדצמ׳' => 12,
588
            ],
589
        ],
590
        'ja_JP' => [
591
            'pattern' => '~^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})$~',
592
        ],
593
        'ka_GE' => [
594
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\.\s(?P<year>\d{4})$~',
595
            'months' => [
596
                'იან' => 1,
597
                'თებ' => 2,
598
                'მარ' => 3,
599
                'აპრ' => 4,
600
                'მაი' => 5,
601
                'ივნ' => 6,
602
                'ივლ' => 7,
603
                'აგვ' => 8,
604
                'სექ' => 9,
605
                'ოქტ' => 10,
606
                'ნოე' => 11,
607
                'დეკ' => 12,
608
            ],
609
        ],
610
        'kk' => [
611
            'pattern' => '~^(?P<year>\d{4})\sж\.\s(?P<day>\d{2})\s(?P<month>.*?)$~',
612
            'months' => [
613
                'қаң.' => 1,
614
                'ақп.' => 2,
615
                'нау.' => 3,
616
                'сәу.' => 4,
617
                'мам.' => 5,
618
                'мау.' => 6,
619
                'шіл.' => 7,
620
                'там.' => 8,
621
                'қыр.' => 9,
622
                'қаз.' => 10,
623
                'қар.' => 11,
624
                'жел.' => 12,
625
            ],
626
        ],
627
        'km_KH' => [
628
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
629
            'months' => [
630
                'មករា' => 1,
631
                'កុម្ភៈ' => 2,
632
                'មីនា' => 3,
633
                'មេសា' => 4,
634
                'ឧសភា' => 5,
635
                'មិថុនា' => 6,
636
                'កក្កដា' => 7,
637
                'សីហា' => 8,
638
                'កញ្ញា' => 9,
639
                'តុលា' => 10,
640
                'វិច្ឆិកា' => 11,
641
                'ធ្នូ' => 12,
642
            ],
643
        ],
644
        'kn_IN' => [
645
            'pattern' => '~^(?P<month>.*?)\s(?P<day>\d{1,2}),\s(?P<year>\d{4})$~',
646
            'months' => [
647
                'ಜನವರಿ' => 1,
648
                'ಫೆಬ್ರವರಿ' => 2,
649
                'ಮಾರ್ಚ್' => 3,
650
                'ಏಪ್ರಿ' => 4,
651
                'ಮೇ' => 5,
652
                'ಜೂನ್' => 6,
653
                'ಜುಲೈ' => 7,
654
                'ಆಗ' => 8,
655
                'ಸೆಪ್ಟೆಂ' => 9,
656
                'ಅಕ್ಟೋ' => 10,
657
                'ನವೆಂ' => 11,
658
                'ಡಿಸೆಂ' => 12,
659
            ],
660
        ],
661
        'ko_KR' => [
662
            'pattern' => '~^(?P<year>\d{4})\.\s(?P<month>\d{1,2})\.\s(?P<day>\d{1,2})\.$~',
663
        ],
664
        'ky_KG' => [
665
            'pattern' => '~^(?P<year>\d{4})-ж\.,\s(?P<day>\d{1,2})-(?P<month>.*?)$~',
666
            'months' => [
667
                'янв.' => 1,
668
                'фев.' => 2,
669
                'мар.' => 3,
670
                'апр.' => 4,
671
                'май' => 5,
672
                'июн.' => 6,
673
                'июл.' => 7,
674
                'авг.' => 8,
675
                'сен.' => 9,
676
                'окт.' => 10,
677
                'ноя.' => 11,
678
                'дек.' => 12,
679
            ],
680
        ],
681
        'lo_LA' => [
682
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
683
            'months' => [
684
                'ມ.ກ.' => 1,
685
                'ກ.ພ.' => 2,
686
                'ມ.ນ.' => 3,
687
                'ມ.ສ.' => 4,
688
                'ພ.ພ.' => 5,
689
                'ມິ.ຖ.' => 6,
690
                'ກ.ລ.' => 7,
691
                'ສ.ຫ.' => 8,
692
                'ກ.ຍ.' => 9,
693
                'ຕ.ລ.' => 10,
694
                'ພ.ຈ.' => 11,
695
                'ທ.ວ.' => 12,
696
            ],
697
        ],
698
        'lt' => [
699
            'pattern' => '~^(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})$~',
700
        ],
701
        'lv' => [
702
            'pattern' => '~^(?P<year>\d{4})\.\sgada\s(?P<day>\d{1,2})\.\s(?P<month>.*?)$~',
703
            'months' => [
704
                'janv.' => 1,
705
                'febr.' => 2,
706
                'marts' => 3,
707
                'apr.' => 4,
708
                'maijs' => 5,
709
                'jūn.' => 6,
710
                'jūl.' => 7,
711
                'aug.' => 8,
712
                'sept.' => 9,
713
                'okt.' => 10,
714
                'nov.' => 11,
715
                'dec.' => 12,
716
            ],
717
        ],
718
        'mk_MK' => [
719
            'pattern' => '~^(?P<day>\d{2})\.(?P<month>\d{1,2})\.(?P<year>\d{4})$~',
720
        ],
721
        'ml_IN' => [
722
            'pattern' => '~^(?P<year>\d{4}),\s(?P<month>.*?)\s(?P<day>\d{1,2})$~',
723
            'months' => [
724
                'ജനു' => 1,
725
                'ഫെബ്രു' => 2,
726
                'മാർ' => 3,
727
                'ഏപ്രി' => 4,
728
                'മേയ്' => 5,
729
                'ജൂൺ' => 6,
730
                'ജൂലൈ' => 7,
731
                'ഓഗ' => 8,
732
                'സെപ്റ്റം' => 9,
733
                'ഒക്ടോ' => 10,
734
                'നവം' => 11,
735
                'ഡിസം' => 12,
736
            ],
737
        ],
738
        'mn_MN' => [
739
            'pattern' => '~^(?P<year>\d{4})\sоны\s(?P<month>\d{1,2})-р\sсарын\s(?P<day>\d{1,2})$~',
740
        ],
741
        'mr_IN' => [
742
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?),\s(?P<year>\d{4})$~',
743
            'convert' => [__CLASS__, 'convertMarathiNumbers'],
744
            'months' => [
745
                'जाने' => 1,
746
                'फेब्रु' => 2,
747
                'मार्च' => 3,
748
                'एप्रि' => 4,
749
                'मे' => 5,
750
                'जून' => 6,
751
                'जुलै' => 7,
752
                'ऑग' => 8,
753
                'सप्टें' => 9,
754
                'ऑक्टो' => 10,
755
                'नोव्हें' => 11,
756
                'डिसें' => 12,
757
            ],
758
        ],
759
        'ms' => [
760
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
761
            'months' => [
762
                'Jan' => 1,
763
                'Feb' => 2,
764
                'Mac' => 3,
765
                'Apr' => 4,
766
                'Mei' => 5,
767
                'Jun' => 6,
768
                'Jul' => 7,
769
                'Ogo' => 8,
770
                'Sep' => 9,
771
                'Okt' => 10,
772
                'Nov' => 11,
773
                'Dis' => 12,
774
            ],
775
        ],
776
        'my_MM' => [
777
            'pattern' => '~^(?P<year>\d{4})၊\s(?P<month>.*?)\s(?P<day>\d{1,2})$~',
778
            'convert' => [__CLASS__, 'convertBurmeseNumbers'],
779
            'months' => [
780
                'ဇန်' => 1,
781
                'ဖေ' => 2,
782
                'မတ်' => 3,
783
                'ဧ' => 4,
784
                'မေ' => 5,
785
                'ဇွန်' => 6,
786
                'ဇူ' => 7,
787
                'ဩ' => 8,
788
                'စက်' => 9,
789
                'အောက်' => 10,
790
                'နို' => 11,
791
                'ဒီ' => 12,
792
            ],
793
        ],
794
        'ne_NP' => [
795
            'pattern' => '~^(?P<year>\d{4})\s(?P<month>.*?)\s(?P<day>\d{1,2})$~',
796
            'convert' => [__CLASS__, 'convertNepalNumbers'],
797
            'months' => [
798
                'जनवरी' => 1,
799
                'फेब्रुअरी' => 2,
800
                'मार्च' => 3,
801
                'अप्रिल' => 4,
802
                'मे' => 5,
803
                'जुन' => 6,
804
                'जुलाई' => 7,
805
                'अगस्ट' => 8,
806
                'सेप्टेम्बर' => 9,
807
                'अक्टोबर' => 10,
808
                'नोभेम्बर' => 11,
809
                'डिसेम्बर' => 12,
810
            ],
811
        ],
812
        'nl_NL' => [
813
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
814
            'months' => [
815
                'jan.' => 1,
816
                'feb.' => 2,
817
                'mrt.' => 3,
818
                'apr.' => 4,
819
                'mei' => 5,
820
                'jun.' => 6,
821
                'jul.' => 7,
822
                'aug.' => 8,
823
                'sep.' => 9,
824
                'okt.' => 10,
825
                'nov.' => 11,
826
                'dec.' => 12,
827
            ],
828
        ],
829
        'no_NO' => [
830
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>.*?)\s(?P<year>\d{4})$~',
831
            'months' => [
832
                'jan.' => 1,
833
                'feb.' => 2,
834
                'mar.' => 3,
835
                'apr.' => 4,
836
                'mai' => 5,
837
                'jun.' => 6,
838
                'jul.' => 7,
839
                'aug.' => 8,
840
                'sep.' => 9,
841
                'okt.' => 10,
842
                'nov.' => 11,
843
                'des.' => 12,
844
            ],
845
        ],
846
        'pl_PL' => [
847
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
848
            'months' => [
849
                'sty' => 1,
850
                'lut' => 2,
851
                'mar' => 3,
852
                'kwi' => 4,
853
                'maj' => 5,
854
                'cze' => 6,
855
                'lip' => 7,
856
                'sie' => 8,
857
                'wrz' => 9,
858
                'paź' => 10,
859
                'lis' => 11,
860
                'gru' => 12,
861
            ],
862
        ],
863
        'pt_BR' => [
864
            'pattern' => '~^(?P<day>\d{1,2})\sde\s(?P<month>.*?)\.\sde\s(?P<year>\d{4})$~',
865
            'months' => [
866
                'jan' => 1,
867
                'fev' => 2,
868
                'mar' => 3,
869
                'abr' => 4,
870
                'mai' => 5,
871
                'jun' => 6,
872
                'jul' => 7,
873
                'ago' => 8,
874
                'set' => 9,
875
                'out' => 10,
876
                'nov' => 11,
877
                'dez' => 12,
878
            ],
879
        ],
880
        'pt_PT' => [
881
            'pattern' => '~^(?P<day>\d{2})/(?P<month>\d{2})/(?P<year>\d{4})$~',
882
        ],
883
        'ro' => [
884
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
885
            'months' => [
886
                'ian.' => 1,
887
                'feb.' => 2,
888
                'mar.' => 3,
889
                'apr.' => 4,
890
                'mai' => 5,
891
                'iun.' => 6,
892
                'iul.' => 7,
893
                'aug.' => 8,
894
                'sept.' => 9,
895
                'oct.' => 10,
896
                'nov.' => 11,
897
                'dec.' => 12,
898
            ],
899
        ],
900
        'ru_RU' => [
901
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})\sг\.$~',
902
            'months' => [
903
                'янв.' => 1,
904
                'февр.' => 2,
905
                'мар.' => 3,
906
                'апр.' => 4,
907
                'мая' => 5,
908
                'июн.' => 6,
909
                'июл.' => 7,
910
                'авг.' => 8,
911
                'сент.' => 9,
912
                'окт.' => 10,
913
                'нояб.' => 11,
914
                'дек.' => 12,
915
            ],
916
        ],
917
        'si_LK' => [
918
            'pattern' => '~^(?P<year>\d{4})\s(?P<month>.*?)\s(?P<day>\d{1,2})$~',
919
            'months' => [
920
                'ජන' => 1,
921
                'පෙබ' => 2,
922
                'මාර්තු' => 3,
923
                'අප්‍රේල්' => 4,
924
                'මැයි' => 5,
925
                'ජූනි' => 6,
926
                'ජූලි' => 7,
927
                'අගෝ' => 8,
928
                'සැප්' => 9,
929
                'ඔක්' => 10,
930
                'නොවැ' => 11,
931
                'දෙසැ' => 12,
932
            ],
933
        ],
934
        'sk' => [
935
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>\d{1,2})\.\s(?P<year>\d{4})$~',
936
        ],
937
        'sl' => [
938
            'pattern' => '~^(?P<day>\d{1,2})\.\s(?P<month>.*?)\s(?P<year>\d{4})$~',
939
            'months' => [
940
                'jan.' => 1,
941
                'feb.' => 2,
942
                'mar.' => 3,
943
                'apr.' => 4,
944
                'maj' => 5,
945
                'jun.' => 6,
946
                'jul.' => 7,
947
                'avg.' => 8,
948
                'sep.' => 9,
949
                'okt.' => 10,
950
                'nov.' => 11,
951
                'dec.' => 12,
952
            ],
953
        ],
954
        'sr' => [
955
            'pattern' => '~^(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{4})\.$~',
956
        ],
957
        'sv_SE' => [
958
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
959
            'months' => [
960
                'jan.' => 1,
961
                'feb.' => 2,
962
                'mars' => 3,
963
                'apr.' => 4,
964
                'maj' => 5,
965
                'juni' => 6,
966
                'juli' => 7,
967
                'aug.' => 8,
968
                'sep.' => 9,
969
                'okt.' => 10,
970
                'nov.' => 11,
971
                'dec.' => 12,
972
            ],
973
        ],
974
        'sw' => [
975
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
976
            'months' => [
977
                'Jan' => 1,
978
                'Feb' => 2,
979
                'Mac' => 3,
980
                'Apr' => 4,
981
                'Mei' => 5,
982
                'Jun' => 6,
983
                'Jul' => 7,
984
                'Ago' => 8,
985
                'Sep' => 9,
986
                'Okt' => 10,
987
                'Nov' => 11,
988
                'Des' => 12,
989
            ],
990
        ],
991
        'ta_IN' => [
992
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?),\s(?P<year>\d{4})$~',
993
            'months' => [
994
                'ஜன.' => 1,
995
                'பிப்.' => 2,
996
                'மார்.' => 3,
997
                'ஏப்.' => 4,
998
                'மே' => 5,
999
                'ஜூன்' => 6,
1000
                'ஜூலை' => 7,
1001
                'ஆக.' => 8,
1002
                'செப்.' => 9,
1003
                'அக்.' => 10,
1004
                'நவ.' => 11,
1005
                'டிச.' => 12,
1006
            ],
1007
        ],
1008
        'te_IN' => [
1009
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?),\s(?P<year>\d{4})$~',
1010
            'months' => [
1011
                'జన' => 1,
1012
                'ఫిబ్ర' => 2,
1013
                'మార్చి' => 3,
1014
                'ఏప్రి' => 4,
1015
                'మే' => 5,
1016
                'జూన్' => 6,
1017
                'జులై' => 7,
1018
                'ఆగ' => 8,
1019
                'సెప్టెం' => 9,
1020
                'అక్టో' => 10,
1021
                'నవం' => 11,
1022
                'డిసెం' => 12,
1023
            ],
1024
        ],
1025
        'th' => [
1026
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
1027
            'convertCalendar' => [__CLASS__, 'convertThailandCalendar'],
1028
            'months' => [
1029
                'ม.ค.' => 1,
1030
                'ก.พ.' => 2,
1031
                'มี.ค.' => 3,
1032
                'เม.ย.' => 4,
1033
                'พ.ค.' => 5,
1034
                'มิ.ย.' => 6,
1035
                'ก.ค.' => 7,
1036
                'ส.ค.' => 8,
1037
                'ก.ย.' => 9,
1038
                'ต.ค.' => 10,
1039
                'พ.ย.' => 11,
1040
                'ธ.ค.' => 12,
1041
            ],
1042
        ],
1043
        'tr_TR' => [
1044
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})$~',
1045
            'months' => [
1046
                'Oca' => 1,
1047
                'Şub' => 2,
1048
                'Mar' => 3,
1049
                'Nis' => 4,
1050
                'May' => 5,
1051
                'Haz' => 6,
1052
                'Tem' => 7,
1053
                'Ağu' => 8,
1054
                'Eyl' => 9,
1055
                'Eki' => 10,
1056
                'Kas' => 11,
1057
                'Ara' => 12,
1058
            ],
1059
        ],
1060
        'uk' => [
1061
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?)\s(?P<year>\d{4})\sр\.$~',
1062
            'months' => [
1063
                'січ.' => 1,
1064
                'лют.' => 2,
1065
                'бер.' => 3,
1066
                'квіт.' => 4,
1067
                'трав.' => 5,
1068
                'черв.' => 6,
1069
                'лип.' => 7,
1070
                'серп.' => 8,
1071
                'вер.' => 9,
1072
                'жовт.' => 10,
1073
                'лист.' => 11,
1074
                'груд.' => 12,
1075
            ],
1076
        ],
1077
        'vi' => [
1078
            'pattern' => '~^(?P<day>\d{1,2})\s(?P<month>.*?),\s(?P<year>\d{4})$~',
1079
            'months' => [
1080
                'thg 1' => 1,
1081
                'thg 2' => 2,
1082
                'thg 3' => 3,
1083
                'thg 4' => 4,
1084
                'thg 5' => 5,
1085
                'thg 6' => 6,
1086
                'thg 7' => 7,
1087
                'thg 8' => 8,
1088
                'thg 9' => 9,
1089
                'thg 10' => 10,
1090
                'thg 11' => 11,
1091
                'thg 12' => 12,
1092
            ],
1093
        ],
1094
        'zh_CN' => [
1095
            'pattern' => '~^(?P<year>\d{4})年(?P<month>.*?)(?P<day>\d{1,2})日$~',
1096
            'months' => [
1097
                '1月' => 1,
1098
                '2月' => 2,
1099
                '3月' => 3,
1100
                '4月' => 4,
1101
                '5月' => 5,
1102
                '6月' => 6,
1103
                '7月' => 7,
1104
                '8月' => 8,
1105
                '9月' => 9,
1106
                '10月' => 10,
1107
                '11月' => 11,
1108
                '12月' => 12,
1109
            ],
1110
        ],
1111
        'zh_HK' => [
1112
            'pattern' => '~^(?P<year>\d{4})年(?P<month>.*?)(?P<day>\d{1,2})日$~',
1113
            'months' => [
1114
                '1月' => 1,
1115
                '2月' => 2,
1116
                '3月' => 3,
1117
                '4月' => 4,
1118
                '5月' => 5,
1119
                '6月' => 6,
1120
                '7月' => 7,
1121
                '8月' => 8,
1122
                '9月' => 9,
1123
                '10月' => 10,
1124
                '11月' => 11,
1125
                '12月' => 12,
1126
            ],
1127
        ],
1128
        'zh_TW' => [
1129
            'pattern' => '~^(?P<year>\d{4})年(?P<month>.*?)(?P<day>\d{1,2})日$~',
1130
            'months' => [
1131
                '1月' => 1,
1132
                '2月' => 2,
1133
                '3月' => 3,
1134
                '4月' => 4,
1135
                '5月' => 5,
1136
                '6月' => 6,
1137
                '7月' => 7,
1138
                '8月' => 8,
1139
                '9月' => 9,
1140
                '10月' => 10,
1141
                '11月' => 11,
1142
                '12月' => 12,
1143
            ],
1144
        ],
1145
        'zu' => [
1146
            'pattern' => '~^(?P<month>.*?)\s(?P<day>\d{1,2}),\s(?P<year>\d{4})$~',
1147
            'months' => [
1148
                'Jan' => 1,
1149
                'Feb' => 2,
1150
                'Mas' => 3,
1151
                'Eph' => 4,
1152
                'Mey' => 5,
1153
                'Jun' => 6,
1154
                'Jul' => 7,
1155
                'Aga' => 8,
1156
                'Sep' => 9,
1157
                'Okt' => 10,
1158
                'Nov' => 11,
1159
                'Dis' => 12,
1160
            ],
1161
        ],
1162
    ];
1163
1164
    /**
1165
     * Convert a date as localized string to a \DateTimeInterface object depending on locale.
1166
     *
1167
     * @param string $locale   locale
1168
     * @param string $dateText localized date
1169
     *
1170
     * @return \DateTimeInterface|null returns \DateTimeInterface or null if error
1171
     */
1172 954
    public static function formatted(string $locale, string $dateText): ?\DateTimeInterface
1173
    {
1174 954
        $locale = LocaleHelper::getNormalizeLocale($locale);
1175
1176 954
        if (!isset(self::MEDIUM_DATE_PATTERNS[$locale])) {
1177
            return null;
1178
        }
1179 954
        $datePatternObj = self::MEDIUM_DATE_PATTERNS[$locale];
1180
1181 954
        if (isset($datePatternObj['convert'])) {
1182 73
            $dateText = forward_static_call($datePatternObj['convert'], $dateText);
1183
        }
1184
1185 954
        if (preg_match($datePatternObj['pattern'], $dateText, $match)) {
1186 954
            $day = $match['day'];
1187 954
            $month = $match['month'];
1188 954
            $year = $match['year'];
1189
1190 954
            if (isset($datePatternObj['months'])) {
1191 786
                if (!isset($datePatternObj['months'][$month])) {
1192
                    throw new \RuntimeException(
1193
                        'Error convert date. Locale ' . $locale . '. Date: ' . $dateText .
1194
                        '. Matches: ' . var_export($match, true)
1195
                    );
1196
                }
1197 786
                $month = $datePatternObj['months'][$month];
1198
            }
1199
1200 954
            if (isset($datePatternObj['convertCalendar'])) {
1201 37
                [$year, $month, $day] = forward_static_call($datePatternObj['convertCalendar'], $year, $month, $day);
1202
            }
1203
1204 954
            $dateTime = \DateTimeImmutable::createFromFormat(
1205 954
                'Y.m.d H:i:s',
1206 954
                $year . '.' . $month . '.' . $day . ' 00:00:00',
1207 954
                new \DateTimeZone('UTC')
1208
            );
1209
1210 954
            if ($dateTime !== false) {
1211 954
                return $dateTime;
1212
            }
1213
        }
1214
1215 2
        return null;
1216
    }
1217
1218
    /**
1219
     * @param string|int $unixTime
1220
     *
1221
     * @return \DateTimeInterface|null
1222
     */
1223 20
    public static function unixTimeToDateTime($unixTime): ?\DateTimeInterface
1224
    {
1225 20
        $dateTime = \DateTimeImmutable::createFromFormat(
1226 20
            'U',
1227 20
            (string) $unixTime,
1228 20
            new \DateTimeZone('UTC')
1229
        );
1230
1231 20
        return $dateTime === false ? null : $dateTime;
1232
    }
1233
1234
    /**
1235
     * @param string $str
1236
     *
1237
     * @return string
1238
     */
1239 25
    private static function convertBengaliNumbers(string $str): string
1240
    {
1241 25
        return str_replace(
1242 25
            ['০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'],
1243 25
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
1244 25
            $str
1245
        );
1246
    }
1247
1248
    /**
1249
     * @param string $str
1250
     *
1251
     * @return string
1252
     */
1253 25
    private static function convertFarsiNumbers(string $str): string
1254
    {
1255 25
        return str_replace(
1256 25
            ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'],
1257 25
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
1258 25
            $str
1259
        );
1260
    }
1261
1262
    /**
1263
     * @param int $persianYear
1264
     * @param int $persianMonth
1265
     * @param int $persianDay
1266
     *
1267
     * @return array
1268
     */
1269 25
    private static function convertPersianToGregorianCalendar(
1270
        int $persianYear,
1271
        int $persianMonth,
1272
        int $persianDay
1273
    ): array {
1274 25
        $gregorianDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
1275 25
        $persianDaysInMonth = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29];
1276 25
        $jy = $persianYear - 979;
1277 25
        $jm = $persianMonth - 1;
1278 25
        $jd = $persianDay - 1;
1279 25
        $persianDayNo = 365 * $jy + floor($jy / 33) * 8 + floor(($jy % 33 + 3) / 4);
1280 25
        for ($i = 0; $i < $jm; ++$i) {
1281 25
            $persianDayNo += $persianDaysInMonth[$i];
1282
        }
1283 25
        $persianDayNo += $jd;
1284 25
        $gregorianDayNo = $persianDayNo + 79;
1285 25
        $gregorianYear = 1600 + 400 * floor($gregorianDayNo / 146097);
1286 25
        $gregorianDayNo %= 146097;
1287 25
        $leap = true;
1288
1289 25
        if ($gregorianDayNo >= 36525) {
1290
            $gregorianDayNo--;
1291
            $gregorianYear += 100 * floor($gregorianDayNo / 36524);
1292
            $gregorianDayNo %= 36524;
1293
1294
            if ($gregorianDayNo >= 365) {
1295
                $gregorianDayNo++;
1296
            } else {
1297
                $leap = false;
1298
            }
1299
        }
1300 25
        $gregorianYear += 4 * floor($gregorianDayNo / 1461);
1301 25
        $gregorianDayNo %= 1461;
1302
1303 25
        if ($gregorianDayNo >= 366) {
1304 21
            $leap = false;
1305 21
            $gregorianDayNo--;
1306 21
            $gregorianYear += floor($gregorianDayNo / 365);
1307 21
            $gregorianDayNo %= 365;
1308
        }
1309 25
        for ($i = 0; $gregorianDayNo >= $gregorianDaysInMonth[$i] + ($i === 1 && $leap); $i++) {
1310 23
            $gregorianDayNo -= $gregorianDaysInMonth[$i] + ($i === 1 && $leap);
1311
        }
1312 25
        $gregorianMonth = $i + 1;
1313 25
        $gregorianDay = $gregorianDayNo + 1;
1314
1315 25
        return [$gregorianYear, $gregorianMonth, $gregorianDay];
1316
    }
1317
1318
    /**
1319
     * @param string $str
1320
     *
1321
     * @return string
1322
     */
1323 25
    private static function convertMarathiNumbers(string $str): string
1324
    {
1325 25
        return str_replace(
1326 25
            ['०', '१', '२', '३', '४', '५', '६', '७', '८', '९'],
1327 25
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
1328 25
            $str
1329
        );
1330
    }
1331
1332
    /**
1333
     * @param string $str
1334
     *
1335
     * @return string
1336
     */
1337 25
    private static function convertBurmeseNumbers(string $str): string
1338
    {
1339 25
        return str_replace(
1340 25
            ['၀', '၁', '၂', '၃', '၄', '၅', '၆', '၇', '၈', '၉'],
1341 25
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
1342 25
            $str
1343
        );
1344
    }
1345
1346
    /**
1347
     * @param string $str
1348
     *
1349
     * @return string
1350
     */
1351 25
    private static function convertNepalNumbers(string $str): string
1352
    {
1353 25
        return str_replace(
1354 25
            ['०', '१', '२', '३', '४', '५', '६', '७', '८', '९'],
1355 25
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
1356 25
            $str
1357
        );
1358
    }
1359
1360
    /**
1361
     * @param int $year
1362
     * @param int $month
1363
     * @param int $day
1364
     *
1365
     * @return array
1366
     */
1367 25
    private static function convertThailandCalendar(int $year, int $month, int $day): array
1368
    {
1369 25
        return [$year - 543, $month, $day];
1370
    }
1371
}
1372