Skip to content

Commit 39eeecd

Browse files
LiviaMedeirosptomato
authored andcommitted
Adjust ISO8601 representation for years between 1 BCE and 999 CE
Old format: `+000YYY` New format: `0YYY`
1 parent 61e8dd0 commit 39eeecd

File tree

5 files changed

+31
-19
lines changed

5 files changed

+31
-19
lines changed

docs/cookbook/makeExpandedTemporal.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ function bigIntAbs(n) {
88
// number of digits.
99
function formatExpandedYear(year) {
1010
let yearString;
11-
if (year < 1000 || year > 9999) {
11+
if (year < 0 || year > 9999) {
1212
let sign = year < 0 ? '-' : '+';
1313
let yearNumber = bigIntAbs(year);
1414
yearString = sign + `${yearNumber}`.padStart(10, '0');
1515
} else {
16-
yearString = `${year}`;
16+
yearString = `${year}`.padStart(4, '0');
1717
}
1818
return yearString;
1919
}

polyfill/lib/ecmascript.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,12 +1925,12 @@ export const ES = ObjectAssign({}, ES2020, {
19251925
},
19261926
ISOYearString: (year) => {
19271927
let yearString;
1928-
if (year < 1000 || year > 9999) {
1928+
if (year < 0 || year > 9999) {
19291929
let sign = year < 0 ? '-' : '+';
19301930
let yearNumber = MathAbs(year);
19311931
yearString = sign + `000000${yearNumber}`.slice(-6);
19321932
} else {
1933-
yearString = `${year}`;
1933+
yearString = `0000${year}`.slice(-4);
19341934
}
19351935
return yearString;
19361936
},

polyfill/test/timezone.mjs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,21 +113,27 @@ describe('TimeZone', () => {
113113
equal(`${tz.getInstantFor(dt)}`, '2019-10-29T09:46:38.271986102Z');
114114
});
115115
it('year ≤ 99', () => {
116-
const dt = Temporal.PlainDateTime.from('+000098-10-29T10:46:38.271986102');
116+
let dt = Temporal.PlainDateTime.from('0098-10-29T10:46:38.271986102');
117117
const tz = Temporal.TimeZone.from('+06:00');
118-
equal(`${tz.getInstantFor(dt)}`, '+000098-10-29T04:46:38.271986102Z');
118+
equal(`${tz.getInstantFor(dt)}`, '0098-10-29T04:46:38.271986102Z');
119+
dt = Temporal.PlainDateTime.from('+000098-10-29T10:46:38.271986102');
120+
equal(`${tz.getInstantFor(dt)}`, '0098-10-29T04:46:38.271986102Z');
119121
});
120122
it('year < 1', () => {
121-
let dt = Temporal.PlainDateTime.from('+000000-10-29T10:46:38.271986102');
123+
let dt = Temporal.PlainDateTime.from('0000-10-29T10:46:38.271986102');
122124
const tz = Temporal.TimeZone.from('+06:00');
123-
equal(`${tz.getInstantFor(dt)}`, '+000000-10-29T04:46:38.271986102Z');
125+
equal(`${tz.getInstantFor(dt)}`, '0000-10-29T04:46:38.271986102Z');
126+
dt = Temporal.PlainDateTime.from('+000000-10-29T10:46:38.271986102');
127+
equal(`${tz.getInstantFor(dt)}`, '0000-10-29T04:46:38.271986102Z');
124128
dt = Temporal.PlainDateTime.from('-001000-10-29T10:46:38.271986102');
125129
equal(`${tz.getInstantFor(dt)}`, '-001000-10-29T04:46:38.271986102Z');
126130
});
127131
it('year 0 leap day', () => {
128-
const dt = Temporal.PlainDateTime.from('+000000-02-29T00:00');
132+
let dt = Temporal.PlainDateTime.from('0000-02-29T00:00');
129133
const tz = Temporal.TimeZone.from('Europe/London');
130-
equal(`${tz.getInstantFor(dt)}`, '+000000-02-29T00:01:15Z');
134+
equal(`${tz.getInstantFor(dt)}`, '0000-02-29T00:01:15Z');
135+
dt = Temporal.PlainDateTime.from('+000000-02-29T00:00');
136+
equal(`${tz.getInstantFor(dt)}`, '0000-02-29T00:01:15Z');
131137
});
132138
it('outside of Instant range', () => {
133139
const max = Temporal.PlainDateTime.from('+275760-09-13T23:59:59.999999999');

polyfill/test/zoneddatetime.mjs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,18 +2386,24 @@ describe('ZonedDateTime', () => {
23862386
equal(`${zdt.toInstant()}`, '2019-10-29T09:46:38.271986102Z');
23872387
});
23882388
it('year ≤ 99', () => {
2389-
const zdt = ZonedDateTime.from('+000098-10-29T10:46:38.271986102+00:00[UTC]');
2390-
equal(`${zdt.toInstant()}`, '+000098-10-29T10:46:38.271986102Z');
2389+
let zdt = ZonedDateTime.from('0098-10-29T10:46:38.271986102+00:00[UTC]');
2390+
equal(`${zdt.toInstant()}`, '0098-10-29T10:46:38.271986102Z');
2391+
zdt = ZonedDateTime.from('+000098-10-29T10:46:38.271986102+00:00[UTC]');
2392+
equal(`${zdt.toInstant()}`, '0098-10-29T10:46:38.271986102Z');
23912393
});
23922394
it('year < 1', () => {
2393-
let zdt = ZonedDateTime.from('+000000-10-29T10:46:38.271986102+00:00[UTC]');
2394-
equal(`${zdt.toInstant()}`, '+000000-10-29T10:46:38.271986102Z');
2395+
let zdt = ZonedDateTime.from('0000-10-29T10:46:38.271986102+00:00[UTC]');
2396+
equal(`${zdt.toInstant()}`, '0000-10-29T10:46:38.271986102Z');
2397+
zdt = ZonedDateTime.from('+000000-10-29T10:46:38.271986102+00:00[UTC]');
2398+
equal(`${zdt.toInstant()}`, '0000-10-29T10:46:38.271986102Z');
23952399
zdt = ZonedDateTime.from('-001000-10-29T10:46:38.271986102+00:00[UTC]');
23962400
equal(`${zdt.toInstant()}`, '-001000-10-29T10:46:38.271986102Z');
23972401
});
23982402
it('year 0 leap day', () => {
2399-
const zdt = ZonedDateTime.from('+000000-02-29T00:00-00:01:15[Europe/London]');
2400-
equal(`${zdt.toInstant()}`, '+000000-02-29T00:01:15Z');
2403+
let zdt = ZonedDateTime.from('0000-02-29T00:00-00:01:15[Europe/London]');
2404+
equal(`${zdt.toInstant()}`, '0000-02-29T00:01:15Z');
2405+
zdt = ZonedDateTime.from('+000000-02-29T00:00-00:01:15[Europe/London]');
2406+
equal(`${zdt.toInstant()}`, '0000-02-29T00:01:15Z');
24012407
});
24022408
});
24032409
describe('ZonedDateTime.toPlainDate()', () => {

spec/plaindate.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -864,9 +864,9 @@ <h1>BalanceISODate ( _year_, _month_, _day_ )</h1>
864864
<h1>PadISOYear ( _y_ )</h1>
865865
<emu-alg>
866866
1. Assert: _y_ is an integer.
867-
1. If _y_ &gt; 999 and _y_ ≤ 9999, then
868-
1. Return _y_ formatted as a four-digit decimal number.
869-
1. If _y_ 0, let _yearSign_ be *"+"*; otherwise, let _yearSign_ be *"-"*.
867+
1. If _y_ ≥ 0 and _y_ ≤ 9999, then
868+
1. Return _y_ formatted as a four-digit decimal number, padded to the left with zeroes as necessary.
869+
1. If _y_ &gt; 0, let _yearSign_ be *"+"*; otherwise, let _yearSign_ be *"-"*.
870870
1. Let _year_ be abs(_y_), formatted as a six-digit decimal number, padded to the left with zeroes as necessary.
871871
1. Return the string-concatenation of _yearSign_ and _year_.
872872
</emu-alg>

0 commit comments

Comments
 (0)