Skip to content

Commit e046ccd

Browse files
committed
Fix fractionalSecondDigits in Duration.toString()
Port of tc39/proposal-temporal#1956
1 parent b733c21 commit e046ccd

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

lib/ecmascript.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2557,7 +2557,9 @@ export function TemporalDurationToString(
25572557
decimalPart = `${fraction}`.padStart(9, '0').slice(0, precision);
25582558
}
25592559
if (decimalPart) secondParts.unshift('.', decimalPart);
2560-
if (!JSBI.equal(secondsBigInt, ZERO) || secondParts.length) secondParts.unshift(abs(secondsBigInt).toString());
2560+
if (!JSBI.equal(secondsBigInt, ZERO) || secondParts.length || precision !== 'auto') {
2561+
secondParts.unshift(abs(secondsBigInt).toString());
2562+
}
25612563
if (secondParts.length) timeParts.push(`${secondParts.join('')}S`);
25622564
if (timeParts.length) timeParts.unshift('T');
25632565
if (!dateParts.length && !timeParts.length) return 'PT0S';

test/duration.mjs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,35 @@ describe('Duration', () => {
295295
equal(d2.toString(options), 'PT15H23M30.0000000S');
296296
equal(d3.toString(options), 'PT15H23M30.5432000S');
297297
});
298+
it('pads correctly in edge cases', () => {
299+
const d4 = Duration.from({ years: 3 });
300+
equal(d4.toString(), 'P3Y');
301+
equal(d4.toString({ fractionalSecondDigits: 0 }), 'P3YT0S');
302+
equal(d4.toString({ smallestUnit: 'seconds' }), 'P3YT0S');
303+
equal(d4.toString({ smallestUnit: 'milliseconds' }), 'P3YT0.000S');
304+
equal(d4.toString({ fractionalSecondDigits: 5 }), 'P3YT0.00000S');
305+
306+
const d5 = Duration.from({ minutes: 30 });
307+
equal(d5.toString(), 'PT30M');
308+
equal(d5.toString({ fractionalSecondDigits: 0 }), 'PT30M0S');
309+
equal(d5.toString({ smallestUnit: 'seconds' }), 'PT30M0S');
310+
equal(d5.toString({ smallestUnit: 'milliseconds' }), 'PT30M0.000S');
311+
equal(d5.toString({ fractionalSecondDigits: 5 }), 'PT30M0.00000S');
312+
313+
const d6 = Duration.from({ milliseconds: 100 });
314+
equal(d6.toString(), 'PT0.1S');
315+
equal(d6.toString({ fractionalSecondDigits: 0 }), 'PT0S');
316+
equal(d6.toString({ smallestUnit: 'seconds' }), 'PT0S');
317+
equal(d6.toString({ smallestUnit: 'milliseconds' }), 'PT0.100S');
318+
equal(d6.toString({ fractionalSecondDigits: 5 }), 'PT0.10000S');
319+
320+
const zero = new Duration();
321+
equal(zero.toString(), 'PT0S');
322+
equal(zero.toString({ fractionalSecondDigits: 0 }), 'PT0S');
323+
equal(zero.toString({ smallestUnit: 'seconds' }), 'PT0S');
324+
equal(zero.toString({ smallestUnit: 'milliseconds' }), 'PT0.000S');
325+
equal(zero.toString({ fractionalSecondDigits: 5 }), 'PT0.00000S');
326+
});
298327
it('auto is the default', () => {
299328
[d1, d2, d3].forEach((d) => equal(d.toString({ fractionalSecondDigits: 'auto' }), d.toString()));
300329
});

0 commit comments

Comments
 (0)