@formatjs/intl-datetimeformat 7.1.0 → 7.1.2
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/add-all-tz.js +319 -318
- package/add-golden-tz.js +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/package.json +5 -5
- package/polyfill-force.js +28 -44
- package/polyfill.iife.js +2803 -3046
- package/polyfill.js +29 -45
- package/should-polyfill.js +38 -50
- package/src/abstract/BasicFormatMatcher.d.ts +5 -5
- package/src/abstract/BasicFormatMatcher.js +87 -103
- package/src/abstract/BestFitFormatMatcher.d.ts +12 -12
- package/src/abstract/BestFitFormatMatcher.js +102 -108
- package/src/abstract/DateTimeStyleFormat.d.ts +2 -2
- package/src/abstract/DateTimeStyleFormat.js +47 -62
- package/src/abstract/FormatDateTime.d.ts +7 -7
- package/src/abstract/FormatDateTime.js +12 -12
- package/src/abstract/FormatDateTimePattern.d.ts +11 -11
- package/src/abstract/FormatDateTimePattern.js +185 -198
- package/src/abstract/FormatDateTimeRange.d.ts +3 -3
- package/src/abstract/FormatDateTimeRange.js +9 -8
- package/src/abstract/FormatDateTimeRangeToParts.d.ts +4 -4
- package/src/abstract/FormatDateTimeRangeToParts.js +14 -12
- package/src/abstract/FormatDateTimeToParts.d.ts +9 -9
- package/src/abstract/FormatDateTimeToParts.js +17 -18
- package/src/abstract/InitializeDateTimeFormat.d.ts +15 -15
- package/src/abstract/InitializeDateTimeFormat.js +206 -184
- package/src/abstract/PartitionDateTimePattern.d.ts +8 -8
- package/src/abstract/PartitionDateTimePattern.js +15 -14
- package/src/abstract/PartitionDateTimeRangePattern.d.ts +4 -4
- package/src/abstract/PartitionDateTimeRangePattern.js +168 -161
- package/src/abstract/ToDateTimeOptions.d.ts +5 -5
- package/src/abstract/ToDateTimeOptions.js +68 -60
- package/src/abstract/ToLocalTime.d.ts +21 -21
- package/src/abstract/ToLocalTime.js +116 -45
- package/src/abstract/skeleton.d.ts +8 -8
- package/src/abstract/skeleton.js +231 -280
- package/src/abstract/utils.d.ts +1 -1
- package/src/abstract/utils.js +21 -20
- package/src/core.d.ts +17 -17
- package/src/core.js +250 -286
- package/src/data/all-tz.generated.d.ts +8 -0
- package/src/data/all-tz.generated.js +462 -0
- package/src/data/links.generated.d.ts +261 -0
- package/src/data/links.generated.js +260 -0
- package/src/get_internal_slots.d.ts +3 -1
- package/src/get_internal_slots.js +8 -7
- package/src/packer.d.ts +2 -2
- package/src/packer.js +23 -35
- package/src/to_locale_string.d.ts +3 -3
- package/src/to_locale_string.js +11 -11
- package/src/types.d.ts +34 -39
- package/src/types.js +1 -1
- package/supported-locales.generated.js +573 -1
- package/test262-main.d.ts +4 -1
- package/test262-main.js +24600 -44193
- package/src/data/all-tz.d.ts +0 -6
- package/src/data/all-tz.js +0 -461
- package/src/data/links.d.ts +0 -259
- package/src/data/links.js +0 -260
|
@@ -1,164 +1,171 @@
|
|
|
1
|
-
import { PartitionPattern, RangePatternType, SameValue, TimeClip
|
|
2
|
-
import { FormatDateTimePattern
|
|
3
|
-
import { ToLocalTime } from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { PartitionPattern, RangePatternType, SameValue, TimeClip } from "@formatjs/ecma402-abstract";
|
|
2
|
+
import { FormatDateTimePattern } from "./FormatDateTimePattern.js";
|
|
3
|
+
import { ToLocalTime } from "./ToLocalTime.js";
|
|
4
|
+
const TABLE_2_FIELDS = [
|
|
5
|
+
"era",
|
|
6
|
+
"year",
|
|
7
|
+
"month",
|
|
8
|
+
"day",
|
|
9
|
+
"dayPeriod",
|
|
10
|
+
"ampm",
|
|
11
|
+
"hour",
|
|
12
|
+
"minute",
|
|
13
|
+
"second",
|
|
14
|
+
"fractionalSecondDigits"
|
|
15
15
|
];
|
|
16
16
|
export function PartitionDateTimeRangePattern(dtf, x, y, implDetails) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
17
|
+
x = TimeClip(x);
|
|
18
|
+
if (x.isNaN()) {
|
|
19
|
+
throw new RangeError("Invalid start time");
|
|
20
|
+
}
|
|
21
|
+
y = TimeClip(y);
|
|
22
|
+
if (y.isNaN()) {
|
|
23
|
+
throw new RangeError("Invalid end time");
|
|
24
|
+
}
|
|
25
|
+
/** IMPL START */
|
|
26
|
+
const { getInternalSlots, tzData, localeData } = implDetails;
|
|
27
|
+
const internalSlots = getInternalSlots(dtf);
|
|
28
|
+
const dataLocale = internalSlots.dataLocale;
|
|
29
|
+
const dataLocaleData = localeData[dataLocale];
|
|
30
|
+
/** IMPL END */
|
|
31
|
+
const tm1 = ToLocalTime(
|
|
32
|
+
x,
|
|
33
|
+
// @ts-ignore
|
|
34
|
+
internalSlots.calendar,
|
|
35
|
+
internalSlots.timeZone,
|
|
36
|
+
{ tzData }
|
|
37
|
+
);
|
|
38
|
+
const tm2 = ToLocalTime(
|
|
39
|
+
y,
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
internalSlots.calendar,
|
|
42
|
+
internalSlots.timeZone,
|
|
43
|
+
{ tzData }
|
|
44
|
+
);
|
|
45
|
+
const { pattern, rangePatterns } = internalSlots;
|
|
46
|
+
let rangePattern;
|
|
47
|
+
let dateFieldsPracticallyEqual = true;
|
|
48
|
+
let patternContainsLargerDateField = false;
|
|
49
|
+
for (const fieldName of TABLE_2_FIELDS) {
|
|
50
|
+
if (dateFieldsPracticallyEqual && !patternContainsLargerDateField) {
|
|
51
|
+
let rp = fieldName in rangePatterns ? rangePatterns[fieldName] : undefined;
|
|
52
|
+
if (rangePattern !== undefined && rp === undefined) {
|
|
53
|
+
patternContainsLargerDateField = true;
|
|
54
|
+
} else {
|
|
55
|
+
rangePattern = rp;
|
|
56
|
+
if (fieldName === "ampm") {
|
|
57
|
+
let v1 = tm1.hour;
|
|
58
|
+
let v2 = tm2.hour;
|
|
59
|
+
if (v1 > 11 && v2 < 11 || v1 < 11 && v2 > 11) {
|
|
60
|
+
dateFieldsPracticallyEqual = false;
|
|
61
|
+
}
|
|
62
|
+
} else if (fieldName === "dayPeriod") {} else if (fieldName === "fractionalSecondDigits") {
|
|
63
|
+
let fractionalSecondDigits = internalSlots.fractionalSecondDigits;
|
|
64
|
+
if (fractionalSecondDigits === undefined) {
|
|
65
|
+
fractionalSecondDigits = 3;
|
|
66
|
+
}
|
|
67
|
+
let v1 = Math.floor(tm1.millisecond * 10 ** (fractionalSecondDigits - 3));
|
|
68
|
+
let v2 = Math.floor(tm2.millisecond * 10 ** (fractionalSecondDigits - 3));
|
|
69
|
+
if (!SameValue(v1, v2)) {
|
|
70
|
+
dateFieldsPracticallyEqual = false;
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
let v1 = tm1[fieldName];
|
|
74
|
+
let v2 = tm2[fieldName];
|
|
75
|
+
if (!SameValue(v1, v2)) {
|
|
76
|
+
dateFieldsPracticallyEqual = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (dateFieldsPracticallyEqual) {
|
|
83
|
+
let result = FormatDateTimePattern(dtf, PartitionPattern(pattern), x, implDetails);
|
|
84
|
+
for (const r of result) {
|
|
85
|
+
r.source = RangePatternType.shared;
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
let result = [];
|
|
90
|
+
if (rangePattern === undefined) {
|
|
91
|
+
rangePattern = rangePatterns.default;
|
|
92
|
+
/** IMPL DETAILS */
|
|
93
|
+
// If rangePatterns.default is also undefined (e.g., when using dateStyle/timeStyle),
|
|
94
|
+
// create a fallback range pattern using the locale's intervalFormatFallback from CLDR
|
|
95
|
+
//
|
|
96
|
+
// SPEC COMPLIANCE:
|
|
97
|
+
// - ECMA-402: https://tc39.es/ecma402/#sec-partitiondatetimerangepattern
|
|
98
|
+
// Delegates to CLDR for interval format patterns
|
|
99
|
+
// - Unicode LDML UTS #35 Part 4: Dates: https://unicode-org.github.io/cldr/ldml/tr35-dates.html#intervalFormats
|
|
100
|
+
// Defines intervalFormatFallback pattern (e.g., "{0} – {1}" or "{1} – {0}")
|
|
101
|
+
// where {0} is start datetime and {1} is end datetime
|
|
102
|
+
// - ICU4J DateIntervalFormat: Uses setFallbackIntervalPattern() to set locale-specific fallback
|
|
103
|
+
// - Firefox SpiderMonkey & WebKit JSC: Both use ICU's UDateIntervalFormat which reads
|
|
104
|
+
// intervalFormatFallback from CLDR data internally
|
|
105
|
+
//
|
|
106
|
+
// LOCALE EXAMPLES from CLDR:
|
|
107
|
+
// - English (en): "{0}\u2009–\u2009{1}" (en dash with thin spaces U+2009)
|
|
108
|
+
// - Japanese (ja): "{0}~{1}" (wave dash U+301C, no spaces)
|
|
109
|
+
// - German (de): "{0}\u2009–\u2009{1}" (en dash with thin spaces)
|
|
110
|
+
// - Arabic (ar): "{0}\u2009–\u2009{1}" (en dash with thin spaces)
|
|
111
|
+
//
|
|
112
|
+
// See: https://github.com/formatjs/formatjs/issues/4168
|
|
113
|
+
if (!rangePattern) {
|
|
114
|
+
const fallback = dataLocaleData.intervalFormatFallback;
|
|
115
|
+
// Parse the fallback pattern (e.g., "{0} – {1}" for English, "{0}~{1}" for Japanese)
|
|
116
|
+
// to extract the separator between {0} and {1}
|
|
117
|
+
const start0 = fallback.indexOf("{0}");
|
|
118
|
+
const start1 = fallback.indexOf("{1}");
|
|
119
|
+
const separator = start0 < start1 ? fallback.substring(start0 + 3, start1) : fallback.substring(start1 + 3, start0);
|
|
120
|
+
rangePattern = { patternParts: start0 < start1 ? [
|
|
121
|
+
{
|
|
122
|
+
source: RangePatternType.startRange,
|
|
123
|
+
pattern: "{0}"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
source: RangePatternType.shared,
|
|
127
|
+
pattern: separator
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
source: RangePatternType.endRange,
|
|
131
|
+
pattern: "{1}"
|
|
132
|
+
}
|
|
133
|
+
] : [
|
|
134
|
+
{
|
|
135
|
+
source: RangePatternType.endRange,
|
|
136
|
+
pattern: "{1}"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
source: RangePatternType.shared,
|
|
140
|
+
pattern: separator
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
source: RangePatternType.startRange,
|
|
144
|
+
pattern: "{0}"
|
|
145
|
+
}
|
|
146
|
+
] };
|
|
147
|
+
}
|
|
148
|
+
// Now we have to replace {0} & {1} with actual pattern
|
|
149
|
+
for (const patternPart of rangePattern.patternParts) {
|
|
150
|
+
if (patternPart.pattern === "{0}" || patternPart.pattern === "{1}") {
|
|
151
|
+
patternPart.pattern = pattern;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const rangePatternPart of rangePattern.patternParts) {
|
|
156
|
+
const { source, pattern } = rangePatternPart;
|
|
157
|
+
let z;
|
|
158
|
+
if (source === RangePatternType.startRange || source === RangePatternType.shared) {
|
|
159
|
+
z = x;
|
|
160
|
+
} else {
|
|
161
|
+
z = y;
|
|
162
|
+
}
|
|
163
|
+
const patternParts = PartitionPattern(pattern);
|
|
164
|
+
let partResult = FormatDateTimePattern(dtf, patternParts, z, implDetails);
|
|
165
|
+
for (const r of partResult) {
|
|
166
|
+
r.source = source;
|
|
167
|
+
}
|
|
168
|
+
result = result.concat(partResult);
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
164
171
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
* https://tc39.es/ecma402/#sec-todatetimeoptions
|
|
3
|
+
* @param options
|
|
4
|
+
* @param required
|
|
5
|
+
* @param defaults
|
|
6
|
+
*/
|
|
7
7
|
export declare function ToDateTimeOptions(options?: Intl.DateTimeFormatOptions | null, required?: string, defaults?: string): Intl.DateTimeFormatOptions;
|
|
@@ -1,63 +1,71 @@
|
|
|
1
|
-
import { ToObject } from
|
|
1
|
+
import { ToObject } from "@formatjs/ecma402-abstract";
|
|
2
2
|
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
* https://tc39.es/ecma402/#sec-todatetimeoptions
|
|
4
|
+
* @param options
|
|
5
|
+
* @param required
|
|
6
|
+
* @param defaults
|
|
7
|
+
*/
|
|
8
8
|
export function ToDateTimeOptions(options, required, defaults) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
9
|
+
if (options === undefined) {
|
|
10
|
+
options = null;
|
|
11
|
+
} else {
|
|
12
|
+
options = ToObject(options);
|
|
13
|
+
}
|
|
14
|
+
options = Object.create(options);
|
|
15
|
+
let needDefaults = true;
|
|
16
|
+
if (required === "date" || required === "any") {
|
|
17
|
+
for (const prop of [
|
|
18
|
+
"weekday",
|
|
19
|
+
"year",
|
|
20
|
+
"month",
|
|
21
|
+
"day"
|
|
22
|
+
]) {
|
|
23
|
+
const value = options[prop];
|
|
24
|
+
if (value !== undefined) {
|
|
25
|
+
needDefaults = false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (required === "time" || required === "any") {
|
|
30
|
+
for (const prop of [
|
|
31
|
+
"dayPeriod",
|
|
32
|
+
"hour",
|
|
33
|
+
"minute",
|
|
34
|
+
"second",
|
|
35
|
+
"fractionalSecondDigits"
|
|
36
|
+
]) {
|
|
37
|
+
const value = options[prop];
|
|
38
|
+
if (value !== undefined) {
|
|
39
|
+
needDefaults = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (options.dateStyle !== undefined || options.timeStyle !== undefined) {
|
|
44
|
+
needDefaults = false;
|
|
45
|
+
}
|
|
46
|
+
if (required === "date" && options.timeStyle) {
|
|
47
|
+
throw new TypeError("Intl.DateTimeFormat date was required but timeStyle was included");
|
|
48
|
+
}
|
|
49
|
+
if (required === "time" && options.dateStyle) {
|
|
50
|
+
throw new TypeError("Intl.DateTimeFormat time was required but dateStyle was included");
|
|
51
|
+
}
|
|
52
|
+
if (needDefaults && (defaults === "date" || defaults === "all")) {
|
|
53
|
+
for (const prop of [
|
|
54
|
+
"year",
|
|
55
|
+
"month",
|
|
56
|
+
"day"
|
|
57
|
+
]) {
|
|
58
|
+
options[prop] = "numeric";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (needDefaults && (defaults === "time" || defaults === "all")) {
|
|
62
|
+
for (const prop of [
|
|
63
|
+
"hour",
|
|
64
|
+
"minute",
|
|
65
|
+
"second"
|
|
66
|
+
]) {
|
|
67
|
+
options[prop] = "numeric";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return options;
|
|
63
71
|
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { UnpackedZoneData } from
|
|
2
|
-
import Decimal from
|
|
1
|
+
import { type UnpackedZoneData } from "@formatjs/ecma402-abstract";
|
|
2
|
+
import type Decimal from "decimal.js";
|
|
3
3
|
export interface ToLocalTimeImplDetails {
|
|
4
|
-
|
|
4
|
+
tzData: Record<string, UnpackedZoneData[]>;
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
* https://tc39.es/ecma402/#sec-tolocaltime
|
|
8
|
+
* @param t
|
|
9
|
+
* @param calendar
|
|
10
|
+
* @param timeZone
|
|
11
|
+
*/
|
|
12
12
|
export declare function ToLocalTime(t: Decimal, calendar: string, timeZone: string, { tzData }: ToLocalTimeImplDetails): {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
weekday: number;
|
|
14
|
+
era: string;
|
|
15
|
+
year: number;
|
|
16
|
+
relatedYear: undefined;
|
|
17
|
+
yearName: undefined;
|
|
18
|
+
month: number;
|
|
19
|
+
day: number;
|
|
20
|
+
hour: number;
|
|
21
|
+
minute: number;
|
|
22
|
+
second: number;
|
|
23
|
+
millisecond: number;
|
|
24
|
+
inDST: boolean;
|
|
25
|
+
timeZoneOffset: number;
|
|
26
26
|
};
|