Skip to content

Commit 0277305

Browse files
ptomato12wrigja
authored andcommitted
Editorial: Combine TemporalTimeZoneIdentifier and TimeZoneBracketedName
The contents of a bracketed time zone annotation consist of the exact same set of strings that can be given as a bare time zone identifier, so we don't need to have two separate productions for this. UPSTREAM_COMMIT=6db76f4808100e2bd92e3aa379ac55b88dad4d91
1 parent 9abc8b3 commit 0277305

File tree

2 files changed

+13
-43
lines changed

2 files changed

+13
-43
lines changed

lib/ecmascript.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,7 @@ export function ParseTemporalTimeZoneString(stringIdent: string): Partial<{
494494
}> {
495495
try {
496496
let canonicalIdent = GetCanonicalTimeZoneIdentifier(stringIdent);
497-
if (canonicalIdent) {
498-
canonicalIdent = canonicalIdent.toString();
499-
if (TestTimeZoneOffsetString(canonicalIdent)) return { offset: canonicalIdent };
500-
return { ianaName: canonicalIdent };
501-
}
497+
if (canonicalIdent) return { ianaName: canonicalIdent.toString() };
502498
} catch {
503499
// fall through
504500
}

test/validStrings.mjs

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -270,33 +270,13 @@ const timeZoneUTCOffsetSign = withCode(
270270
sign,
271271
(data, result) => (data.offsetSign = result === '-' || result === '\u2212' ? '-' : '+')
272272
);
273-
function saveOffsetHour(data, result) {
274-
data.offsetHour = +result;
275-
}
276-
const timeZoneUTCOffsetHour = withCode(hour, saveOffsetHour);
277-
const timeZoneUTCOffsetHourNotValidMonth = withCode(zeroPaddedInclusive(13, 23, 2), saveOffsetHour);
278-
const timeZoneUTCOffsetMinute = withCode(minuteSecond, (data, result) => (data.offsetMinute = +result));
279-
const timeZoneUTCOffsetSecond = withCode(minuteSecond, (data, result) => (data.offsetSecond = +result));
280-
const timeZoneUTCOffsetFraction = withCode(fraction, (data, result) => {
281-
result = result.slice(1);
282-
const fraction = result.padEnd(9, '0');
283-
data.offsetFraction = +fraction;
284-
});
285-
function saveOffset(data) {
286-
if (data.offsetSign !== undefined && data.offsetHour !== undefined) {
287-
const h = `${data.offsetHour}`.padStart(2, '0');
288-
const m = `${data.offsetMinute || 0}`.padStart(2, '0');
289-
const s = `${data.offsetSecond || 0}`.padStart(2, '0');
290-
data.offset = `${data.offsetSign}${h}:${m}`;
291-
if (data.offsetFraction) {
292-
let fraction = `${data.offsetFraction}`.padStart(9, '0');
293-
while (fraction.endsWith('0')) fraction = fraction.slice(0, -1);
294-
data.offset += `:${s}.${fraction}`;
295-
} else if (data.offsetSecond) {
296-
data.offset += `:${s}`;
297-
}
298-
if (data.offset === '-00:00') data.offset = '+00:00';
299-
}
273+
const timeZoneUTCOffsetHour = hour;
274+
const timeZoneUTCOffsetHourNotValidMonth = zeroPaddedInclusive(13, 23, 2);
275+
const timeZoneUTCOffsetMinute = minuteSecond;
276+
const timeZoneUTCOffsetSecond = minuteSecond;
277+
const timeZoneUTCOffsetFraction = fraction;
278+
function saveOffset(data, result) {
279+
data.offset = ES.GetCanonicalTimeZoneIdentifier(result).toString();
300280
}
301281
const timeZoneNumericUTCOffset = withCode(
302282
seq(
@@ -333,25 +313,19 @@ const timeZoneUTCOffsetName = seq(
333313
hour,
334314
choice([minuteSecond, [minuteSecond, [fraction]]], seq(':', minuteSecond, [':', minuteSecond, [fraction]]))
335315
);
336-
const timeZoneBracketedName = withCode(
337-
choice(timeZoneUTCOffsetName, ...timezoneNames),
338-
(data, result) => (data.ianaName = ES.GetCanonicalTimeZoneIdentifier(result).toString())
339-
);
340-
const timeZoneBracketedAnnotation = seq('[', timeZoneBracketedName, ']');
341-
const timeZoneIANAName = withCode(
342-
choice(...timezoneNames),
316+
const timeZoneIANAName = choice(...timezoneNames);
317+
const timeZoneIdentifier = withCode(
318+
choice(timeZoneUTCOffsetName, timeZoneIANAName),
343319
(data, result) => (data.ianaName = ES.GetCanonicalTimeZoneIdentifier(result).toString())
344320
);
321+
const timeZoneBracketedAnnotation = seq('[', timeZoneIdentifier, ']');
345322
const timeZoneOffsetRequired = withCode(seq(timeZoneUTCOffset, [timeZoneBracketedAnnotation]), (data) => {
346323
if (!('offset' in data)) data.offset = undefined;
347324
});
348325
const timeZoneNameRequired = withCode(seq([timeZoneUTCOffset], timeZoneBracketedAnnotation), (data) => {
349326
if (!('offset' in data)) data.offset = undefined;
350327
});
351328
const timeZone = choice(timeZoneOffsetRequired, timeZoneNameRequired);
352-
const temporalTimeZoneIdentifier = withCode(choice(timeZoneNumericUTCOffset, timeZoneIANAName), (data) => {
353-
if (!('offset' in data)) data.offset = undefined;
354-
});
355329
const calendarName = withCode(choice(...calendarNames), (data, result) => (data.calendar = result));
356330
const calendar = seq('[u-ca=', calendarName, ']');
357331
const timeSpec = seq(
@@ -464,7 +438,7 @@ const goals = {
464438
Duration: duration,
465439
MonthDay: choice(dateSpecMonthDay, calendarDateTime),
466440
Time: choice(calendarTime, calendarDateTimeTimeRequired),
467-
TimeZone: choice(temporalTimeZoneIdentifier, seq(date, [timeSpecSeparator], timeZone, [calendar])),
441+
TimeZone: choice(timeZoneIdentifier, seq(date, [timeSpecSeparator], timeZone, [calendar])),
468442
YearMonth: choice(dateSpecYearMonth, calendarDateTime),
469443
ZonedDateTime: zonedDateTime
470444
};

0 commit comments

Comments
 (0)