date-and-time 3.4.1 → 3.6.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/PLUGINS.md +38 -9
- package/README.md +59 -38
- package/date-and-time.d.ts +53 -21
- package/date-and-time.js +20 -22
- package/date-and-time.min.js +1 -1
- package/esm/date-and-time.es.js +20 -22
- package/esm/date-and-time.es.min.js +1 -1
- package/esm/date-and-time.mjs +20 -22
- package/esm/plugin/timezone.es.js +117 -65
- package/esm/plugin/timezone.mjs +117 -65
- package/package.json +4 -4
- package/plugin/timezone.d.ts +27 -0
- package/plugin/timezone.js +117 -65
package/esm/plugin/timezone.mjs
CHANGED
|
@@ -455,7 +455,7 @@ var plugin = function (proto, date) {
|
|
|
455
455
|
'Alaska Daylight Time': 'AKDT', 'Alaska Standard Time': 'AKST', 'Almaty Standard Time': 'ALMT',
|
|
456
456
|
'Almaty Summer Time': 'ALMST', 'Amazon Standard Time': 'AMT', 'Amazon Summer Time': 'AMST',
|
|
457
457
|
'Anadyr Standard Time': 'ANAT', 'Anadyr Summer Time': 'ANAST', 'Apia Daylight Time': 'WSDT',
|
|
458
|
-
'Apia Standard Time': 'WSST', 'Aqtau Standard Time': 'AQTT', 'Aqtau Summer Time': '
|
|
458
|
+
'Apia Standard Time': 'WSST', 'Aqtau Standard Time': 'AQTT', 'Aqtau Summer Time': 'AQTST',
|
|
459
459
|
'Aqtobe Standard Time': 'AQTT', 'Aqtobe Summer Time': 'AQST', 'Arabian Daylight Time': 'ADT',
|
|
460
460
|
'Arabian Standard Time': 'AST', 'Argentina Standard Time': 'ART', 'Argentina Summer Time': 'ARST',
|
|
461
461
|
'Armenia Standard Time': 'AMT', 'Armenia Summer Time': 'AMST', 'Atlantic Daylight Time': 'ADT',
|
|
@@ -471,19 +471,18 @@ var plugin = function (proto, date) {
|
|
|
471
471
|
'Central Indonesia Time': 'WITA', 'Central Standard Time': 'CST', 'Chamorro Standard Time': 'ChST',
|
|
472
472
|
'Chatham Daylight Time': 'CHADT', 'Chatham Standard Time': 'CHAST', 'Chile Standard Time': 'CLT',
|
|
473
473
|
'Chile Summer Time': 'CLST', 'China Daylight Time': 'CDT', 'China Standard Time': 'CST',
|
|
474
|
-
'
|
|
475
|
-
'
|
|
476
|
-
'
|
|
477
|
-
'
|
|
478
|
-
'
|
|
479
|
-
'East
|
|
480
|
-
'
|
|
481
|
-
'Eastern
|
|
482
|
-
'
|
|
483
|
-
'
|
|
484
|
-
'
|
|
485
|
-
'
|
|
486
|
-
'GMT': 'GMT', 'Galapagos Time': 'GALT', 'Gambier Time': 'GAMT',
|
|
474
|
+
'Christmas Island Time': 'CXT', 'Chuuk Time': 'CHUT', 'Cocos Islands Time': 'CCT',
|
|
475
|
+
'Colombia Standard Time': 'COT', 'Colombia Summer Time': 'COST', 'Cook Islands Half Summer Time': 'CKHST',
|
|
476
|
+
'Cook Islands Standard Time': 'CKT', 'Coordinated Universal Time': 'UTC', 'Cuba Daylight Time': 'CDT',
|
|
477
|
+
'Cuba Standard Time': 'CST', 'Davis Time': 'DAVT', 'Dumont-d’Urville Time': 'DDUT',
|
|
478
|
+
'East Africa Time': 'EAT', 'East Greenland Standard Time': 'EGT', 'East Greenland Summer Time': 'EGST',
|
|
479
|
+
'East Kazakhstan Time': 'ALMT', 'East Timor Time': 'TLT', 'Easter Island Standard Time': 'EAST',
|
|
480
|
+
'Easter Island Summer Time': 'EASST', 'Eastern Daylight Time': 'EDT', 'Eastern European Standard Time': 'EET',
|
|
481
|
+
'Eastern European Summer Time': 'EEST', 'Eastern Indonesia Time': 'WIT', 'Eastern Standard Time': 'EST',
|
|
482
|
+
'Ecuador Time': 'ECT', 'Falkland Islands Standard Time': 'FKST', 'Falkland Islands Summer Time': 'FKDT',
|
|
483
|
+
'Fernando de Noronha Standard Time': 'FNT', 'Fernando de Noronha Summer Time': 'FNST', 'Fiji Standard Time': 'FJT',
|
|
484
|
+
'Fiji Summer Time': 'FJST', 'French Guiana Time': 'GFT', 'French Southern & Antarctic Time': 'TFT',
|
|
485
|
+
'Further-eastern European Time': 'FET', 'Galapagos Time': 'GALT', 'Gambier Time': 'GAMT',
|
|
487
486
|
'Georgia Standard Time': 'GET', 'Georgia Summer Time': 'GEST', 'Gilbert Islands Time': 'GILT',
|
|
488
487
|
'Greenwich Mean Time': 'GMT', 'Guam Standard Time': 'ChST', 'Gulf Standard Time': 'GST',
|
|
489
488
|
'Guyana Time': 'GYT', 'Hawaii-Aleutian Daylight Time': 'HADT', 'Hawaii-Aleutian Standard Time': 'HAST',
|
|
@@ -495,7 +494,7 @@ var plugin = function (proto, date) {
|
|
|
495
494
|
'Korean Daylight Time': 'KDT', 'Korean Standard Time': 'KST', 'Kosrae Time': 'KOST',
|
|
496
495
|
'Krasnoyarsk Standard Time': 'KRAT', 'Krasnoyarsk Summer Time': 'KRAST', 'Kyrgyzstan Time': 'KGT',
|
|
497
496
|
'Lanka Time': 'LKT', 'Line Islands Time': 'LINT', 'Lord Howe Daylight Time': 'LHDT',
|
|
498
|
-
'Lord Howe Standard Time': 'LHST', 'Macao Standard Time': 'CST', 'Macao Summer Time': '
|
|
497
|
+
'Lord Howe Standard Time': 'LHST', 'Macao Standard Time': 'CST', 'Macao Summer Time': 'CDT',
|
|
499
498
|
'Magadan Standard Time': 'MAGT', 'Magadan Summer Time': 'MAGST', 'Malaysia Time': 'MYT',
|
|
500
499
|
'Maldives Time': 'MVT', 'Marquesas Time': 'MART', 'Marshall Islands Time': 'MHT',
|
|
501
500
|
'Mauritius Standard Time': 'MUT', 'Mauritius Summer Time': 'MUST', 'Mawson Time': 'MAWT',
|
|
@@ -508,7 +507,7 @@ var plugin = function (proto, date) {
|
|
|
508
507
|
'North Mariana Islands Time': 'ChST', 'Novosibirsk Standard Time': 'NOVT', 'Novosibirsk Summer Time': 'NOVST',
|
|
509
508
|
'Omsk Standard Time': 'OMST', 'Omsk Summer Time': 'OMSST', 'Pacific Daylight Time': 'PDT',
|
|
510
509
|
'Pacific Standard Time': 'PST', 'Pakistan Standard Time': 'PKT', 'Pakistan Summer Time': 'PKST',
|
|
511
|
-
'Palau Time': 'PWT', 'Papua New Guinea Time': 'PGT', 'Paraguay Standard Time': '
|
|
510
|
+
'Palau Time': 'PWT', 'Papua New Guinea Time': 'PGT', 'Paraguay Standard Time': 'PYT',
|
|
512
511
|
'Paraguay Summer Time': 'PYST', 'Peru Standard Time': 'PET', 'Peru Summer Time': 'PEST',
|
|
513
512
|
'Petropavlovsk-Kamchatski Standard Time': 'PETT', 'Petropavlovsk-Kamchatski Summer Time': 'PETST', 'Philippine Standard Time': 'PST',
|
|
514
513
|
'Philippine Summer Time': 'PHST', 'Phoenix Islands Time': 'PHOT', 'Pitcairn Time': 'PIT',
|
|
@@ -519,7 +518,7 @@ var plugin = function (proto, date) {
|
|
|
519
518
|
'Singapore Standard Time': 'SGT', 'Solomon Islands Time': 'SBT', 'South Africa Standard Time': 'SAST',
|
|
520
519
|
'South Georgia Time': 'GST', 'St. Pierre & Miquelon Daylight Time': 'PMDT', 'St. Pierre & Miquelon Standard Time': 'PMST',
|
|
521
520
|
'Suriname Time': 'SRT', 'Syowa Time': 'SYOT', 'Tahiti Time': 'TAHT',
|
|
522
|
-
'Taipei Daylight Time': '
|
|
521
|
+
'Taipei Daylight Time': 'CDT', 'Taipei Standard Time': 'CST', 'Tajikistan Time': 'TJT',
|
|
523
522
|
'Tokelau Time': 'TKT', 'Tonga Standard Time': 'TOT', 'Tonga Summer Time': 'TOST',
|
|
524
523
|
'Turkmenistan Standard Time': 'TMT', 'Tuvalu Time': 'TVT', 'Ulaanbaatar Standard Time': 'ULAT',
|
|
525
524
|
'Ulaanbaatar Summer Time': 'ULAST', 'Uruguay Standard Time': 'UYT', 'Uruguay Summer Time': 'UYST',
|
|
@@ -535,36 +534,59 @@ var plugin = function (proto, date) {
|
|
|
535
534
|
};
|
|
536
535
|
var options = {
|
|
537
536
|
hour12: false, weekday: 'short', year: 'numeric', month: 'numeric', day: 'numeric',
|
|
538
|
-
hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3
|
|
537
|
+
hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3,
|
|
538
|
+
timeZone: 'UTC'
|
|
539
539
|
};
|
|
540
|
-
var
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
540
|
+
var cache = {
|
|
541
|
+
utc: new Intl.DateTimeFormat('en-US', options)
|
|
542
|
+
};
|
|
543
|
+
var getDateTimeFormat = function (timeZone) {
|
|
544
|
+
if (timeZone) {
|
|
545
|
+
var tz = timeZone.toLowerCase();
|
|
545
546
|
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
547
|
+
if (!cache[tz]) {
|
|
548
|
+
options.timeZone = timeZone;
|
|
549
|
+
cache[tz] = new Intl.DateTimeFormat('en-US', options);
|
|
550
|
+
}
|
|
551
|
+
return cache[tz];
|
|
552
|
+
}
|
|
553
|
+
options.timeZone = undefined;
|
|
554
|
+
return new Intl.DateTimeFormat('en-US', options);
|
|
555
|
+
};
|
|
556
|
+
var formatToParts = function (dateTimeFormat, dateObjOrTime) {
|
|
557
|
+
var array = dateTimeFormat.formatToParts(dateObjOrTime),
|
|
558
|
+
values = {};
|
|
549
559
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
560
|
+
for (var i = 0, len = array.length; i < len; i++) {
|
|
561
|
+
var type = array[i].type,
|
|
562
|
+
value = array[i].value;
|
|
563
|
+
|
|
564
|
+
switch (type) {
|
|
565
|
+
case 'weekday':
|
|
566
|
+
values[type] = 'SunMonTueWedThuFriSat'.indexOf(value) / 3;
|
|
567
|
+
break;
|
|
568
|
+
case 'hour':
|
|
569
|
+
values[type] = value % 24;
|
|
570
|
+
break;
|
|
571
|
+
case 'year':
|
|
572
|
+
case 'month':
|
|
573
|
+
case 'day':
|
|
574
|
+
case 'minute':
|
|
575
|
+
case 'second':
|
|
576
|
+
case 'fractionalSecond':
|
|
577
|
+
values[type] = value | 0;
|
|
565
578
|
}
|
|
566
|
-
|
|
567
|
-
|
|
579
|
+
}
|
|
580
|
+
return values;
|
|
581
|
+
};
|
|
582
|
+
var getTimeFromParts = function (parts) {
|
|
583
|
+
return Date.UTC(
|
|
584
|
+
parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day,
|
|
585
|
+
parts.hour, parts.minute, parts.second, parts.fractionalSecond
|
|
586
|
+
);
|
|
587
|
+
};
|
|
588
|
+
var formatTZ = function (dateObj, arg, timeZone) {
|
|
589
|
+
var parts = formatToParts(getDateTimeFormat(timeZone), dateObj);
|
|
568
590
|
|
|
569
591
|
return date.format({
|
|
570
592
|
getFullYear: function () { return parts.year; },
|
|
@@ -577,18 +599,14 @@ var plugin = function (proto, date) {
|
|
|
577
599
|
getDay: function () { return parts.weekday; },
|
|
578
600
|
getTime: function () { return dateObj.getTime(); },
|
|
579
601
|
getTimezoneOffset: function () {
|
|
580
|
-
return (dateObj.getTime() -
|
|
581
|
-
parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day,
|
|
582
|
-
parts.hour, parts.minute, parts.second, parts.fractionalSecond
|
|
583
|
-
)) / 60000 | 0;
|
|
602
|
+
return (dateObj.getTime() - getTimeFromParts(parts)) / 60000 | 0;
|
|
584
603
|
},
|
|
585
604
|
getTimezoneName: function () { return timeZone || undefined; }
|
|
586
605
|
}, arg);
|
|
587
606
|
};
|
|
588
|
-
var parseTZ = function (
|
|
589
|
-
var pattern = typeof
|
|
590
|
-
var
|
|
591
|
-
|
|
607
|
+
var parseTZ = function (arg1, arg2, timeZone) {
|
|
608
|
+
var pattern = typeof arg2 === 'string' ? date.compile(arg2) : arg2;
|
|
609
|
+
var time = typeof arg1 === 'string' ? date.parse(arg1, pattern, !!timeZone).getTime() : arg1;
|
|
592
610
|
var hasZ = function (array) {
|
|
593
611
|
for (var i = 1, len = array.length; i < len; i++) {
|
|
594
612
|
if (!array[i].indexOf('Z')) {
|
|
@@ -598,8 +616,8 @@ var plugin = function (proto, date) {
|
|
|
598
616
|
return false;
|
|
599
617
|
};
|
|
600
618
|
|
|
601
|
-
if (!timeZone || hasZ(pattern) || timeZone.toUpperCase() === 'UTC') {
|
|
602
|
-
return
|
|
619
|
+
if (!timeZone || hasZ(pattern) || timeZone.toUpperCase() === 'UTC' || isNaN(time)) {
|
|
620
|
+
return new Date(time);
|
|
603
621
|
}
|
|
604
622
|
|
|
605
623
|
var getOffset = function (timeZoneName) {
|
|
@@ -612,19 +630,17 @@ var plugin = function (proto, date) {
|
|
|
612
630
|
return Array.isArray(value) ? value : [];
|
|
613
631
|
};
|
|
614
632
|
|
|
615
|
-
|
|
616
|
-
var
|
|
617
|
-
options.timeZone = timeZone || undefined;
|
|
618
|
-
var dateTimeFormat = new Intl.DateTimeFormat('en-US', options);
|
|
633
|
+
var utc = getDateTimeFormat('UTC');
|
|
634
|
+
var tz = getDateTimeFormat(timeZone);
|
|
619
635
|
var offset = getOffset(timeZone);
|
|
620
|
-
var comparer = function (d) {
|
|
621
|
-
return dateString2 === dateTimeFormat.format(d);
|
|
622
|
-
};
|
|
623
636
|
|
|
624
|
-
for (var
|
|
625
|
-
var
|
|
626
|
-
|
|
627
|
-
|
|
637
|
+
for (var i = 0; i < 2; i++) {
|
|
638
|
+
var targetString = utc.format(time - i * 24 * 60 * 60 * 1000);
|
|
639
|
+
|
|
640
|
+
for (var j = 0, len = offset.length; j < len; j++) {
|
|
641
|
+
if (tz.format(time - (offset[j] + i * 24 * 60 * 60) * 1000) === targetString) {
|
|
642
|
+
return new Date(time - offset[j] * 1000);
|
|
643
|
+
}
|
|
628
644
|
}
|
|
629
645
|
}
|
|
630
646
|
return new Date(NaN);
|
|
@@ -632,6 +648,39 @@ var plugin = function (proto, date) {
|
|
|
632
648
|
var transformTZ = function (dateString, arg1, arg2, timeZone) {
|
|
633
649
|
return formatTZ(date.parse(dateString, arg1), arg2, timeZone);
|
|
634
650
|
};
|
|
651
|
+
var normalizeDateParts = function (parts, adjustEOM) {
|
|
652
|
+
var d = new Date(Date.UTC(
|
|
653
|
+
parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day
|
|
654
|
+
));
|
|
655
|
+
|
|
656
|
+
if (adjustEOM && d.getUTCDate() < parts.day) {
|
|
657
|
+
d.setUTCDate(0);
|
|
658
|
+
}
|
|
659
|
+
parts.year = d.getUTCFullYear();
|
|
660
|
+
parts.month = d.getUTCMonth() + 1;
|
|
661
|
+
parts.day = d.getUTCDate();
|
|
662
|
+
|
|
663
|
+
return parts;
|
|
664
|
+
};
|
|
665
|
+
var addYearsTZ = function (dateObj, years, timeZone) {
|
|
666
|
+
return addMonthsTZ(dateObj, years * 12, timeZone);
|
|
667
|
+
};
|
|
668
|
+
var addMonthsTZ = function (dateObj, months, timeZone) {
|
|
669
|
+
var parts = formatToParts(getDateTimeFormat(timeZone), dateObj);
|
|
670
|
+
|
|
671
|
+
parts.month += months;
|
|
672
|
+
var dateObj2 = parseTZ(getTimeFromParts(normalizeDateParts(parts, true)), [], timeZone);
|
|
673
|
+
|
|
674
|
+
return isNaN(dateObj2.getTime()) ? date.addMonths(dateObj, months, true) : dateObj2;
|
|
675
|
+
};
|
|
676
|
+
var addDaysTZ = function (dateObj, days, timeZone) {
|
|
677
|
+
var parts = formatToParts(getDateTimeFormat(timeZone), dateObj);
|
|
678
|
+
|
|
679
|
+
parts.day += days;
|
|
680
|
+
var dateObj2 = parseTZ(getTimeFromParts(normalizeDateParts(parts, false)), [], timeZone);
|
|
681
|
+
|
|
682
|
+
return isNaN(dateObj2.getTime()) ? date.addDays(dateObj, days, true) : dateObj2;
|
|
683
|
+
};
|
|
635
684
|
|
|
636
685
|
var name = 'timezone';
|
|
637
686
|
|
|
@@ -663,7 +712,10 @@ var plugin = function (proto, date) {
|
|
|
663
712
|
extender: {
|
|
664
713
|
formatTZ: formatTZ,
|
|
665
714
|
parseTZ: parseTZ,
|
|
666
|
-
transformTZ: transformTZ
|
|
715
|
+
transformTZ: transformTZ,
|
|
716
|
+
addYearsTZ: addYearsTZ,
|
|
717
|
+
addMonthsTZ: addMonthsTZ,
|
|
718
|
+
addDaysTZ: addDaysTZ
|
|
667
719
|
}
|
|
668
720
|
});
|
|
669
721
|
return name;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "date-and-time",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0",
|
|
4
4
|
"description": "A Minimalist DateTime utility for Node.js and the browser",
|
|
5
5
|
"main": "date-and-time.js",
|
|
6
6
|
"module": "esm/date-and-time.es.js",
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@rollup/plugin-terser": "^0.4.4",
|
|
53
53
|
"expect.js": "^0.3.1",
|
|
54
|
-
"mocha": "^10.
|
|
55
|
-
"rollup": "^4.
|
|
56
|
-
"tsd": "^0.31.
|
|
54
|
+
"mocha": "^10.7.3",
|
|
55
|
+
"rollup": "^4.22.5",
|
|
56
|
+
"tsd": "^0.31.2"
|
|
57
57
|
}
|
|
58
58
|
}
|
package/plugin/timezone.d.ts
CHANGED
|
@@ -74,6 +74,33 @@ declare module '../date-and-time' {
|
|
|
74
74
|
* @returns A formatted string
|
|
75
75
|
*/
|
|
76
76
|
export function transformTZ(dateString: string, compiledObj1: string[], compiledObj2: string[], timeZone?: string): string;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Adding years considering time zones
|
|
80
|
+
* @param dateObj - A Date object
|
|
81
|
+
* @param years - The number of years to add
|
|
82
|
+
* @param [timeZone] - The time zone to use for the calculation
|
|
83
|
+
* @returns The Date object after adding the specified number of years
|
|
84
|
+
*/
|
|
85
|
+
export function addYearsTZ(dateObj: Date, years: number, timeZone?: string): Date;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Adding months considering time zones
|
|
89
|
+
* @param dateObj - A Date object
|
|
90
|
+
* @param months - The number of months to add
|
|
91
|
+
* @param [timeZone] - The time zone to use for the calculation
|
|
92
|
+
* @returns The Date object after adding the specified number of months
|
|
93
|
+
*/
|
|
94
|
+
export function addMonthsTZ(dateObj: Date, months: number, timeZone?: string): Date;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Adding days considering time zones
|
|
98
|
+
* @param dateObj - A Date object
|
|
99
|
+
* @param days - The number of days to add
|
|
100
|
+
* @param [timeZone] - The time zone to use for the calculation
|
|
101
|
+
* @returns The Date object after adding the specified number of days
|
|
102
|
+
*/
|
|
103
|
+
export function addDaysTZ(dateObj: Date, days: number, timeZone?: string): Date;
|
|
77
104
|
}
|
|
78
105
|
|
|
79
106
|
export default function (proto: unknown, date?: unknown): string;
|
package/plugin/timezone.js
CHANGED
|
@@ -461,7 +461,7 @@
|
|
|
461
461
|
'Alaska Daylight Time': 'AKDT', 'Alaska Standard Time': 'AKST', 'Almaty Standard Time': 'ALMT',
|
|
462
462
|
'Almaty Summer Time': 'ALMST', 'Amazon Standard Time': 'AMT', 'Amazon Summer Time': 'AMST',
|
|
463
463
|
'Anadyr Standard Time': 'ANAT', 'Anadyr Summer Time': 'ANAST', 'Apia Daylight Time': 'WSDT',
|
|
464
|
-
'Apia Standard Time': 'WSST', 'Aqtau Standard Time': 'AQTT', 'Aqtau Summer Time': '
|
|
464
|
+
'Apia Standard Time': 'WSST', 'Aqtau Standard Time': 'AQTT', 'Aqtau Summer Time': 'AQTST',
|
|
465
465
|
'Aqtobe Standard Time': 'AQTT', 'Aqtobe Summer Time': 'AQST', 'Arabian Daylight Time': 'ADT',
|
|
466
466
|
'Arabian Standard Time': 'AST', 'Argentina Standard Time': 'ART', 'Argentina Summer Time': 'ARST',
|
|
467
467
|
'Armenia Standard Time': 'AMT', 'Armenia Summer Time': 'AMST', 'Atlantic Daylight Time': 'ADT',
|
|
@@ -477,19 +477,18 @@
|
|
|
477
477
|
'Central Indonesia Time': 'WITA', 'Central Standard Time': 'CST', 'Chamorro Standard Time': 'ChST',
|
|
478
478
|
'Chatham Daylight Time': 'CHADT', 'Chatham Standard Time': 'CHAST', 'Chile Standard Time': 'CLT',
|
|
479
479
|
'Chile Summer Time': 'CLST', 'China Daylight Time': 'CDT', 'China Standard Time': 'CST',
|
|
480
|
-
'
|
|
481
|
-
'
|
|
482
|
-
'
|
|
483
|
-
'
|
|
484
|
-
'
|
|
485
|
-
'East
|
|
486
|
-
'
|
|
487
|
-
'Eastern
|
|
488
|
-
'
|
|
489
|
-
'
|
|
490
|
-
'
|
|
491
|
-
'
|
|
492
|
-
'GMT': 'GMT', 'Galapagos Time': 'GALT', 'Gambier Time': 'GAMT',
|
|
480
|
+
'Christmas Island Time': 'CXT', 'Chuuk Time': 'CHUT', 'Cocos Islands Time': 'CCT',
|
|
481
|
+
'Colombia Standard Time': 'COT', 'Colombia Summer Time': 'COST', 'Cook Islands Half Summer Time': 'CKHST',
|
|
482
|
+
'Cook Islands Standard Time': 'CKT', 'Coordinated Universal Time': 'UTC', 'Cuba Daylight Time': 'CDT',
|
|
483
|
+
'Cuba Standard Time': 'CST', 'Davis Time': 'DAVT', 'Dumont-d’Urville Time': 'DDUT',
|
|
484
|
+
'East Africa Time': 'EAT', 'East Greenland Standard Time': 'EGT', 'East Greenland Summer Time': 'EGST',
|
|
485
|
+
'East Kazakhstan Time': 'ALMT', 'East Timor Time': 'TLT', 'Easter Island Standard Time': 'EAST',
|
|
486
|
+
'Easter Island Summer Time': 'EASST', 'Eastern Daylight Time': 'EDT', 'Eastern European Standard Time': 'EET',
|
|
487
|
+
'Eastern European Summer Time': 'EEST', 'Eastern Indonesia Time': 'WIT', 'Eastern Standard Time': 'EST',
|
|
488
|
+
'Ecuador Time': 'ECT', 'Falkland Islands Standard Time': 'FKST', 'Falkland Islands Summer Time': 'FKDT',
|
|
489
|
+
'Fernando de Noronha Standard Time': 'FNT', 'Fernando de Noronha Summer Time': 'FNST', 'Fiji Standard Time': 'FJT',
|
|
490
|
+
'Fiji Summer Time': 'FJST', 'French Guiana Time': 'GFT', 'French Southern & Antarctic Time': 'TFT',
|
|
491
|
+
'Further-eastern European Time': 'FET', 'Galapagos Time': 'GALT', 'Gambier Time': 'GAMT',
|
|
493
492
|
'Georgia Standard Time': 'GET', 'Georgia Summer Time': 'GEST', 'Gilbert Islands Time': 'GILT',
|
|
494
493
|
'Greenwich Mean Time': 'GMT', 'Guam Standard Time': 'ChST', 'Gulf Standard Time': 'GST',
|
|
495
494
|
'Guyana Time': 'GYT', 'Hawaii-Aleutian Daylight Time': 'HADT', 'Hawaii-Aleutian Standard Time': 'HAST',
|
|
@@ -501,7 +500,7 @@
|
|
|
501
500
|
'Korean Daylight Time': 'KDT', 'Korean Standard Time': 'KST', 'Kosrae Time': 'KOST',
|
|
502
501
|
'Krasnoyarsk Standard Time': 'KRAT', 'Krasnoyarsk Summer Time': 'KRAST', 'Kyrgyzstan Time': 'KGT',
|
|
503
502
|
'Lanka Time': 'LKT', 'Line Islands Time': 'LINT', 'Lord Howe Daylight Time': 'LHDT',
|
|
504
|
-
'Lord Howe Standard Time': 'LHST', 'Macao Standard Time': 'CST', 'Macao Summer Time': '
|
|
503
|
+
'Lord Howe Standard Time': 'LHST', 'Macao Standard Time': 'CST', 'Macao Summer Time': 'CDT',
|
|
505
504
|
'Magadan Standard Time': 'MAGT', 'Magadan Summer Time': 'MAGST', 'Malaysia Time': 'MYT',
|
|
506
505
|
'Maldives Time': 'MVT', 'Marquesas Time': 'MART', 'Marshall Islands Time': 'MHT',
|
|
507
506
|
'Mauritius Standard Time': 'MUT', 'Mauritius Summer Time': 'MUST', 'Mawson Time': 'MAWT',
|
|
@@ -514,7 +513,7 @@
|
|
|
514
513
|
'North Mariana Islands Time': 'ChST', 'Novosibirsk Standard Time': 'NOVT', 'Novosibirsk Summer Time': 'NOVST',
|
|
515
514
|
'Omsk Standard Time': 'OMST', 'Omsk Summer Time': 'OMSST', 'Pacific Daylight Time': 'PDT',
|
|
516
515
|
'Pacific Standard Time': 'PST', 'Pakistan Standard Time': 'PKT', 'Pakistan Summer Time': 'PKST',
|
|
517
|
-
'Palau Time': 'PWT', 'Papua New Guinea Time': 'PGT', 'Paraguay Standard Time': '
|
|
516
|
+
'Palau Time': 'PWT', 'Papua New Guinea Time': 'PGT', 'Paraguay Standard Time': 'PYT',
|
|
518
517
|
'Paraguay Summer Time': 'PYST', 'Peru Standard Time': 'PET', 'Peru Summer Time': 'PEST',
|
|
519
518
|
'Petropavlovsk-Kamchatski Standard Time': 'PETT', 'Petropavlovsk-Kamchatski Summer Time': 'PETST', 'Philippine Standard Time': 'PST',
|
|
520
519
|
'Philippine Summer Time': 'PHST', 'Phoenix Islands Time': 'PHOT', 'Pitcairn Time': 'PIT',
|
|
@@ -525,7 +524,7 @@
|
|
|
525
524
|
'Singapore Standard Time': 'SGT', 'Solomon Islands Time': 'SBT', 'South Africa Standard Time': 'SAST',
|
|
526
525
|
'South Georgia Time': 'GST', 'St. Pierre & Miquelon Daylight Time': 'PMDT', 'St. Pierre & Miquelon Standard Time': 'PMST',
|
|
527
526
|
'Suriname Time': 'SRT', 'Syowa Time': 'SYOT', 'Tahiti Time': 'TAHT',
|
|
528
|
-
'Taipei Daylight Time': '
|
|
527
|
+
'Taipei Daylight Time': 'CDT', 'Taipei Standard Time': 'CST', 'Tajikistan Time': 'TJT',
|
|
529
528
|
'Tokelau Time': 'TKT', 'Tonga Standard Time': 'TOT', 'Tonga Summer Time': 'TOST',
|
|
530
529
|
'Turkmenistan Standard Time': 'TMT', 'Tuvalu Time': 'TVT', 'Ulaanbaatar Standard Time': 'ULAT',
|
|
531
530
|
'Ulaanbaatar Summer Time': 'ULAST', 'Uruguay Standard Time': 'UYT', 'Uruguay Summer Time': 'UYST',
|
|
@@ -541,36 +540,59 @@
|
|
|
541
540
|
};
|
|
542
541
|
var options = {
|
|
543
542
|
hour12: false, weekday: 'short', year: 'numeric', month: 'numeric', day: 'numeric',
|
|
544
|
-
hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3
|
|
543
|
+
hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3,
|
|
544
|
+
timeZone: 'UTC'
|
|
545
545
|
};
|
|
546
|
-
var
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
546
|
+
var cache = {
|
|
547
|
+
utc: new Intl.DateTimeFormat('en-US', options)
|
|
548
|
+
};
|
|
549
|
+
var getDateTimeFormat = function (timeZone) {
|
|
550
|
+
if (timeZone) {
|
|
551
|
+
var tz = timeZone.toLowerCase();
|
|
551
552
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
553
|
+
if (!cache[tz]) {
|
|
554
|
+
options.timeZone = timeZone;
|
|
555
|
+
cache[tz] = new Intl.DateTimeFormat('en-US', options);
|
|
556
|
+
}
|
|
557
|
+
return cache[tz];
|
|
558
|
+
}
|
|
559
|
+
options.timeZone = undefined;
|
|
560
|
+
return new Intl.DateTimeFormat('en-US', options);
|
|
561
|
+
};
|
|
562
|
+
var formatToParts = function (dateTimeFormat, dateObjOrTime) {
|
|
563
|
+
var array = dateTimeFormat.formatToParts(dateObjOrTime),
|
|
564
|
+
values = {};
|
|
555
565
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
566
|
+
for (var i = 0, len = array.length; i < len; i++) {
|
|
567
|
+
var type = array[i].type,
|
|
568
|
+
value = array[i].value;
|
|
569
|
+
|
|
570
|
+
switch (type) {
|
|
571
|
+
case 'weekday':
|
|
572
|
+
values[type] = 'SunMonTueWedThuFriSat'.indexOf(value) / 3;
|
|
573
|
+
break;
|
|
574
|
+
case 'hour':
|
|
575
|
+
values[type] = value % 24;
|
|
576
|
+
break;
|
|
577
|
+
case 'year':
|
|
578
|
+
case 'month':
|
|
579
|
+
case 'day':
|
|
580
|
+
case 'minute':
|
|
581
|
+
case 'second':
|
|
582
|
+
case 'fractionalSecond':
|
|
583
|
+
values[type] = value | 0;
|
|
571
584
|
}
|
|
572
|
-
|
|
573
|
-
|
|
585
|
+
}
|
|
586
|
+
return values;
|
|
587
|
+
};
|
|
588
|
+
var getTimeFromParts = function (parts) {
|
|
589
|
+
return Date.UTC(
|
|
590
|
+
parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day,
|
|
591
|
+
parts.hour, parts.minute, parts.second, parts.fractionalSecond
|
|
592
|
+
);
|
|
593
|
+
};
|
|
594
|
+
var formatTZ = function (dateObj, arg, timeZone) {
|
|
595
|
+
var parts = formatToParts(getDateTimeFormat(timeZone), dateObj);
|
|
574
596
|
|
|
575
597
|
return date.format({
|
|
576
598
|
getFullYear: function () { return parts.year; },
|
|
@@ -583,18 +605,14 @@
|
|
|
583
605
|
getDay: function () { return parts.weekday; },
|
|
584
606
|
getTime: function () { return dateObj.getTime(); },
|
|
585
607
|
getTimezoneOffset: function () {
|
|
586
|
-
return (dateObj.getTime() -
|
|
587
|
-
parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day,
|
|
588
|
-
parts.hour, parts.minute, parts.second, parts.fractionalSecond
|
|
589
|
-
)) / 60000 | 0;
|
|
608
|
+
return (dateObj.getTime() - getTimeFromParts(parts)) / 60000 | 0;
|
|
590
609
|
},
|
|
591
610
|
getTimezoneName: function () { return timeZone || undefined; }
|
|
592
611
|
}, arg);
|
|
593
612
|
};
|
|
594
|
-
var parseTZ = function (
|
|
595
|
-
var pattern = typeof
|
|
596
|
-
var
|
|
597
|
-
|
|
613
|
+
var parseTZ = function (arg1, arg2, timeZone) {
|
|
614
|
+
var pattern = typeof arg2 === 'string' ? date.compile(arg2) : arg2;
|
|
615
|
+
var time = typeof arg1 === 'string' ? date.parse(arg1, pattern, !!timeZone).getTime() : arg1;
|
|
598
616
|
var hasZ = function (array) {
|
|
599
617
|
for (var i = 1, len = array.length; i < len; i++) {
|
|
600
618
|
if (!array[i].indexOf('Z')) {
|
|
@@ -604,8 +622,8 @@
|
|
|
604
622
|
return false;
|
|
605
623
|
};
|
|
606
624
|
|
|
607
|
-
if (!timeZone || hasZ(pattern) || timeZone.toUpperCase() === 'UTC') {
|
|
608
|
-
return
|
|
625
|
+
if (!timeZone || hasZ(pattern) || timeZone.toUpperCase() === 'UTC' || isNaN(time)) {
|
|
626
|
+
return new Date(time);
|
|
609
627
|
}
|
|
610
628
|
|
|
611
629
|
var getOffset = function (timeZoneName) {
|
|
@@ -618,19 +636,17 @@
|
|
|
618
636
|
return Array.isArray(value) ? value : [];
|
|
619
637
|
};
|
|
620
638
|
|
|
621
|
-
|
|
622
|
-
var
|
|
623
|
-
options.timeZone = timeZone || undefined;
|
|
624
|
-
var dateTimeFormat = new Intl.DateTimeFormat('en-US', options);
|
|
639
|
+
var utc = getDateTimeFormat('UTC');
|
|
640
|
+
var tz = getDateTimeFormat(timeZone);
|
|
625
641
|
var offset = getOffset(timeZone);
|
|
626
|
-
var comparer = function (d) {
|
|
627
|
-
return dateString2 === dateTimeFormat.format(d);
|
|
628
|
-
};
|
|
629
642
|
|
|
630
|
-
for (var
|
|
631
|
-
var
|
|
632
|
-
|
|
633
|
-
|
|
643
|
+
for (var i = 0; i < 2; i++) {
|
|
644
|
+
var targetString = utc.format(time - i * 24 * 60 * 60 * 1000);
|
|
645
|
+
|
|
646
|
+
for (var j = 0, len = offset.length; j < len; j++) {
|
|
647
|
+
if (tz.format(time - (offset[j] + i * 24 * 60 * 60) * 1000) === targetString) {
|
|
648
|
+
return new Date(time - offset[j] * 1000);
|
|
649
|
+
}
|
|
634
650
|
}
|
|
635
651
|
}
|
|
636
652
|
return new Date(NaN);
|
|
@@ -638,6 +654,39 @@
|
|
|
638
654
|
var transformTZ = function (dateString, arg1, arg2, timeZone) {
|
|
639
655
|
return formatTZ(date.parse(dateString, arg1), arg2, timeZone);
|
|
640
656
|
};
|
|
657
|
+
var normalizeDateParts = function (parts, adjustEOM) {
|
|
658
|
+
var d = new Date(Date.UTC(
|
|
659
|
+
parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day
|
|
660
|
+
));
|
|
661
|
+
|
|
662
|
+
if (adjustEOM && d.getUTCDate() < parts.day) {
|
|
663
|
+
d.setUTCDate(0);
|
|
664
|
+
}
|
|
665
|
+
parts.year = d.getUTCFullYear();
|
|
666
|
+
parts.month = d.getUTCMonth() + 1;
|
|
667
|
+
parts.day = d.getUTCDate();
|
|
668
|
+
|
|
669
|
+
return parts;
|
|
670
|
+
};
|
|
671
|
+
var addYearsTZ = function (dateObj, years, timeZone) {
|
|
672
|
+
return addMonthsTZ(dateObj, years * 12, timeZone);
|
|
673
|
+
};
|
|
674
|
+
var addMonthsTZ = function (dateObj, months, timeZone) {
|
|
675
|
+
var parts = formatToParts(getDateTimeFormat(timeZone), dateObj);
|
|
676
|
+
|
|
677
|
+
parts.month += months;
|
|
678
|
+
var dateObj2 = parseTZ(getTimeFromParts(normalizeDateParts(parts, true)), [], timeZone);
|
|
679
|
+
|
|
680
|
+
return isNaN(dateObj2.getTime()) ? date.addMonths(dateObj, months, true) : dateObj2;
|
|
681
|
+
};
|
|
682
|
+
var addDaysTZ = function (dateObj, days, timeZone) {
|
|
683
|
+
var parts = formatToParts(getDateTimeFormat(timeZone), dateObj);
|
|
684
|
+
|
|
685
|
+
parts.day += days;
|
|
686
|
+
var dateObj2 = parseTZ(getTimeFromParts(normalizeDateParts(parts, false)), [], timeZone);
|
|
687
|
+
|
|
688
|
+
return isNaN(dateObj2.getTime()) ? date.addDays(dateObj, days, true) : dateObj2;
|
|
689
|
+
};
|
|
641
690
|
|
|
642
691
|
var name = 'timezone';
|
|
643
692
|
|
|
@@ -669,7 +718,10 @@
|
|
|
669
718
|
extender: {
|
|
670
719
|
formatTZ: formatTZ,
|
|
671
720
|
parseTZ: parseTZ,
|
|
672
|
-
transformTZ: transformTZ
|
|
721
|
+
transformTZ: transformTZ,
|
|
722
|
+
addYearsTZ: addYearsTZ,
|
|
723
|
+
addMonthsTZ: addMonthsTZ,
|
|
724
|
+
addDaysTZ: addDaysTZ
|
|
673
725
|
}
|
|
674
726
|
});
|
|
675
727
|
return name;
|