// |reftest| skip-if(!this.hasOwnProperty('Intl')||!Intl.hasOwnProperty("DurationFormat"))
const {
Integer, Group, Decimal, Fraction, Literal, Unit
} = NumberFormatParts;
const {
Year, Month, Week, Day, Hour, Minute, Second, Millisecond, Microsecond, Nanosecond
} = DurationFormatParts;
const tests = {
"en" : [
{
options: {},
data: [
{
duration: {years: 1 },
expected: [
...Year(Integer("1" ), Literal(" " ), Unit("yr" )),
],
},
{
duration: {years: 2 },
expected: [
...Year(Integer("2" ), Literal(" " ), Unit("yrs" )),
],
},
],
},
],
"de" : [
{
options: {style: "long" },
data: [
{
duration: {years: 1 , months: 2 , weeks: 3 , days: 4 },
expected: [
...Year(Integer("1" ), Literal(" " ), Unit("Jahr" )),
Literal(", " ),
...Month(Integer("2" ), Literal(" " ), Unit("Monate" )),
Literal(", " ),
...Week(Integer("3" ), Literal(" " ), Unit("Wochen" )),
Literal(" und " ),
...Day(Integer("4" ), Literal(" " ), Unit("Tage" )),
],
},
{
duration: {hours: 1 , minutes: 2 },
expected: [
...Hour(Integer("1" ), Literal(" " ), Unit("Stunde" )),
Literal(", " ),
...Minute(Integer("2" ), Literal(" " ), Unit("Minuten" )),
],
},
{
duration: {minutes: 3 , seconds: 4 },
expected: [
...Minute(Integer("3" ), Literal(" " ), Unit("Minuten" )),
Literal(", " ),
...Second(Integer("4" ), Literal(" " ), Unit("Sekunden" )),
],
},
{
duration: {seconds: 5 , milliseconds: 6 },
expected: [
...Second(Integer("5" ), Literal(" " ), Unit("Sekunden" )),
Literal(", " ),
...Millisecond(Integer("6" ), Literal(" " ), Unit("Millisekunden" )),
],
},
{
duration: {milliseconds: 7 , microseconds: 8 },
expected: [
...Millisecond(Integer("7" ), Literal(" " ), Unit("Millisekunden" )),
Literal(", " ),
...Microsecond(Integer("8" ), Literal(" " ), Unit("Mikrosekunden" )),
],
},
{
duration: {microseconds: 9 , nanoseconds: 10 },
expected: [
...Microsecond(Integer("9" ), Literal(" " ), Unit("Mikrosekunden" )),
Literal(", " ),
...Nanosecond(Integer("10" ), Literal(" " ), Unit("Nanosekunden" )),
],
},
// Gaps between time units.
{
duration: {hours: 1 , seconds: 2 },
expected: [
...Hour(Integer("1" ), Literal(" " ), Unit("Stunde" )),
Literal(", " ),
...Second(Integer("2" ), Literal(" " ), Unit("Sekunden" )),
],
},
{
duration: {hours: 3 , milliseconds: 4 },
expected: [
...Hour(Integer("3" ), Literal(" " ), Unit("Stunden" )),
Literal(", " ),
...Millisecond(Integer("4" ), Literal(" " ), Unit("Millisekunden" )),
],
},
{
duration: {hours: 5 , microseconds: 6 },
expected: [
...Hour(Integer("5" ), Literal(" " ), Unit("Stunden" )),
Literal(", " ),
...Microsecond(Integer("6" ), Literal(" " ), Unit("Mikrosekunden" )),
],
},
{
duration: {hours: 7 , nanoseconds: 9 },
expected: [
...Hour(Integer("7" ), Literal(" " ), Unit("Stunden" )),
Literal(", " ),
...Nanosecond(Integer("9" ), Literal(" " ), Unit("Nanosekunden" )),
],
},
],
},
{
options: {style: "short" },
data: [
{
duration: {years: 1 , months: 2 , weeks: 3 , days: 4 },
expected: [
...Year(Integer("1" ), Literal(" " ), Unit("J" )),
Literal(", " ),
...Month(Integer("2" ), Literal(" " ), Unit("Mon." )),
Literal(", " ),
...Week(Integer("3" ), Literal(" " ), Unit("Wo." )),
Literal(" und " ),
...Day(Integer("4" ), Literal(" " ), Unit("Tg." )),
],
},
{
duration: {hours: 1 , minutes: 2 },
expected: [
...Hour(Integer("1" ), Literal(" " ), Unit("Std." )),
Literal(", " ),
...Minute(Integer("2" ), Literal(" " ), Unit("Min." )),
],
},
{
duration: {minutes: 3 , seconds: 4 },
expected: [
...Minute(Integer("3" ), Literal(" " ), Unit("Min." )),
Literal(", " ),
...Second(Integer("4" ), Literal(" " ), Unit("Sek." )),
],
},
{
duration: {seconds: 5 , milliseconds: 6 },
expected: [
...Second(Integer("5" ), Literal(" " ), Unit("Sek." )),
Literal(", " ),
...Millisecond(Integer("6" ), Literal(" " ), Unit("ms" )),
],
},
{
duration: {milliseconds: 7 , microseconds: 8 },
expected: [
...Millisecond(Integer("7" ), Literal(" " ), Unit("ms" )),
Literal(", " ),
...Microsecond(Integer("8" ), Literal(" " ), Unit("μs" )),
],
},
{
duration: {microseconds: 9 , nanoseconds: 10 },
expected: [
...Microsecond(Integer("9" ), Literal(" " ), Unit("μs" )),
Literal(", " ),
...Nanosecond(Integer("10" ), Literal(" " ), Unit("ns" )),
],
},
],
},
{
options: {style: "narrow" },
data: [
{
duration: {years: 1 , months: 2 , weeks: 3 , days: 4 },
expected: [
...Year(Integer("1" ), Literal(" " ), Unit("J" )),
Literal(", " ),
...Month(Integer("2" ), Literal(" " ), Unit("M" )),
Literal(", " ),
...Week(Integer("3" ), Literal(" " ), Unit("W" )),
Literal(" und " ),
...Day(Integer("4" ), Literal(" " ), Unit("T" )),
],
},
{
duration: {hours: 1 , minutes: 2 },
expected: [
...Hour(Integer("1" ), Literal(" " ), Unit("Std." )),
Literal(", " ),
...Minute(Integer("2" ), Literal(" " ), Unit("Min." )),
],
},
{
duration: {minutes: 3 , seconds: 4 },
expected: [
...Minute(Integer("3" ), Literal(" " ), Unit("Min." )),
Literal(", " ),
...Second(Integer("4" ), Literal(" " ), Unit("Sek." )),
],
},
{
duration: {seconds: 5 , milliseconds: 6 },
expected: [
...Second(Integer("5" ), Literal(" " ), Unit("Sek." )),
Literal(", " ),
...Millisecond(Integer("6" ), Literal(" " ), Unit("ms" )),
],
},
{
duration: {milliseconds: 7 , microseconds: 8 },
expected: [
...Millisecond(Integer("7" ), Literal(" " ), Unit("ms" )),
Literal(", " ),
...Microsecond(Integer("8" ), Literal(" " ), Unit("μs" )),
],
},
{
duration: {microseconds: 9 , nanoseconds: 10 },
expected: [
...Microsecond(Integer("9" ), Literal(" " ), Unit("μs" )),
Literal(", " ),
...Nanosecond(Integer("10" ), Literal(" " ), Unit("ns" )),
],
},
],
},
],
"fr" : [
{
options: {style: "digital" },
data: [
// "digital" style defaults to "short" for non-numeric parts.
{
duration: {years: 111 , months: 222 , weeks: 333 , days: 444 },
expected: [
...Year(Integer("111" ), Literal(" " ), Unit("ans" )),
Literal(", " ),
...Month(Integer("222" ), Literal(" " ), Unit("m." )),
Literal(", " ),
...Week(Integer("333" ), Literal(" " ), Unit("sem." )),
Literal(", " ),
...Day(Integer("444" ), Literal(" " ), Unit("j" )),
Literal(" et " ),
...Hour(Integer("0" )),
Literal(":" ),
...Minute(Integer("00" )),
Literal(":" ),
...Second(Integer("00" )),
],
},
{
duration: {hours: 1 , minutes: 0 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("00" )),
Literal(":" ),
...Second(Integer("00" )),
],
},
{
duration: {hours: 1 , minutes: 2 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("02" )),
Literal(":" ),
...Second(Integer("00" )),
],
},
// Fractional digits default to min=0 and max=9.
{
duration: {hours: 1 , minutes: 2 , seconds: 3 , milliseconds: 4 , microseconds: 5 , nanoseconds: 6 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("02" )),
Literal(":" ),
...Second(Integer("03" ), Decimal("," ), Fraction("004005006" )),
],
},
// Zero unit digital parts aren't omitted.
{
duration: {hours: 1 , minutes: 0 , seconds: 3 , milliseconds: 4 , microseconds: 5 , nanoseconds: 6 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("00" )),
Literal(":" ),
...Second(Integer("03" ), Decimal("," ), Fraction("004005006" )),
],
},
],
},
{
options: {style: "digital" , fractionalDigits: 9 },
data: [
{
duration: {hours: 1 , minutes: 2 , seconds: 3 , milliseconds: 4 , microseconds: 5 , nanoseconds: 6 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("02" )),
Literal(":" ),
...Second(Integer("03" ), Decimal("," ), Fraction("004005006" )),
],
},
{
duration: {hours: 1 , minutes: 0 , seconds: 3 , milliseconds: 4 , microseconds: 5 , nanoseconds: 6 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("00" )),
Literal(":" ),
...Second(Integer("03" ), Decimal("," ), Fraction("004005006" )),
],
},
],
},
{
options: {
style: "digital" ,
hoursDisplay: "always" ,
minutesDisplay: "always" ,
secondsDisplay: "always" ,
fractionalDigits: 9 ,
},
data: [
{
duration: {hours: 1 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("00" )),
Literal(":" ),
...Second(Integer("00" ), Decimal("," ), Fraction("000000000" )),
],
},
{
duration: {hours: 1 , minutes: 2 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("02" )),
Literal(":" ),
...Second(Integer("00" ), Decimal("," ), Fraction("000000000" )),
],
},
{
duration: {hours: 1 , minutes: 2 , seconds: 3 , milliseconds: 4 , microseconds: 5 , nanoseconds: 6 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("02" )),
Literal(":" ),
...Second(Integer("03" ), Decimal("," ), Fraction("004005006" )),
],
},
{
duration: {hours: 1 , minutes: 0 , seconds: 3 , milliseconds: 4 , microseconds: 5 , nanoseconds: 6 },
expected: [
...Hour(Integer("1" )),
Literal(":" ),
...Minute(Integer("00" )),
Literal(":" ),
...Second(Integer("03" ), Decimal("," ), Fraction("004005006" )),
],
},
],
},
],
"es" : [
{
options: {
seconds: "2-digit" ,
fractionalDigits: 3 ,
},
data: [
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 3 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("000" ))],
},
{
duration: {seconds: 0 , milliseconds: 1 , microseconds: 2 , nanoseconds: 3 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("001" ))],
},
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 1002003 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("001" ))],
},
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 123001002003 },
expected: [...Second(Integer("123" ), Decimal("," ), Fraction("001" ))],
},
],
},
{
options: {
seconds: "2-digit" ,
fractionalDigits: 6 ,
},
data: [
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 3 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("000000" ))],
},
{
duration: {seconds: 0 , milliseconds: 1 , microseconds: 2 , nanoseconds: 3 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("001002" ))],
},
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 1002003 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("001002" ))],
},
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 123001002003 },
expected: [...Second(Integer("123" ), Decimal("," ), Fraction("001002" ))],
},
],
},
{
options: {
seconds: "2-digit" ,
fractionalDigits: 9 ,
},
data: [
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 3 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("000000003" ))],
},
{
duration: {seconds: 0 , milliseconds: 1 , microseconds: 2 , nanoseconds: 3 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("001002003" ))],
},
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 1002003 },
expected: [...Second(Integer("00" ), Decimal("," ), Fraction("001002003" ))],
},
{
duration: {seconds: 0 , milliseconds: 0 , microseconds: 0 , nanoseconds: 123001002003 },
expected: [...Second(Integer("123" ), Decimal("," ), Fraction("001002003" ))],
},
],
},
],
"ar-EG" : [
{
options: {
years: "long" ,
months: "short" ,
weeks: "short" ,
days: "narrow" ,
yearsDisplay: "always" ,
monthsDisplay: "always" ,
weeksDisplay: "always" ,
daysDisplay: "always" ,
},
data: [
{
duration: {years: 100 , months: 200 , weeks: 0 , days: 1000 },
expected: [
...Year(Integer("١٠٠" ), Literal(" " ), Unit("سنة" )),
Literal("، و" ),
...Month(Integer("٢٠٠" ), Literal(" " ), Unit("شهر" )),
Literal("، و" ),
...Week(Integer("٠" ), Literal(" " ), Unit("أسبوع" )),
Literal("، و" ),
...Day(Integer("١" ), Group("٬" ), Integer("٠٠٠" ), Literal(" " ), Unit("ي" )),
],
},
],
}
],
"zh" : [
{
options: {
years: "narrow" ,
months: "narrow" ,
weeks: "short" ,
days: "short" ,
yearsDisplay: "always" ,
monthsDisplay: "always" ,
weeksDisplay: "always" ,
daysDisplay: "always" ,
hoursDisplay: "always" ,
minutesDisplay: "always" ,
secondsDisplay: "always" ,
millisecondsDisplay: "always" ,
microsecondsDisplay: "always" ,
nanosecondsDisplay: "always" ,
},
data: [
{
duration: {years: 100 , months: 200 , weeks: 0 , days: 1000 },
expected: [
...Year(Integer("100" ), Unit("年" )),
...Month(Integer("200" ), Unit("个月" )),
...Week(Integer("0" ), Unit("周" )),
...Day(Integer("1" ), Group("," ), Integer("000" ), Unit("天" )),
...Hour(Integer("0" ), Unit("小时" )),
...Minute(Integer("0" ), Unit("分钟" )),
...Second(Integer("0" ), Unit("秒" )),
...Millisecond(Integer("0" ), Unit("毫秒" )),
...Microsecond(Integer("0" ), Unit("微秒" )),
...Nanosecond(Integer("0" ), Unit("纳秒" )),
],
},
{
duration: {years: 0 },
expected: [
...Year(Integer("0" ), Unit("年" )),
...Month(Integer("0" ), Unit("个月" )),
...Week(Integer("0" ), Unit("周" )),
...Day(Integer("0" ), Unit("天" )),
...Hour(Integer("0" ), Unit("小时" )),
...Minute(Integer("0" ), Unit("分钟" )),
...Second(Integer("0" ), Unit("秒" )),
...Millisecond(Integer("0" ), Unit("毫秒" )),
...Microsecond(Integer("0" ), Unit("微秒" )),
...Nanosecond(Integer("0" ), Unit("纳秒" )),
],
},
{
duration: {nanoseconds: 0 },
expected: [
...Year(Integer("0" ), Unit("年" )),
...Month(Integer("0" ), Unit("个月" )),
...Week(Integer("0" ), Unit("周" )),
...Day(Integer("0" ), Unit("天" )),
...Hour(Integer("0" ), Unit("小时" )),
...Minute(Integer("0" ), Unit("分钟" )),
...Second(Integer("0" ), Unit("秒" )),
...Millisecond(Integer("0" ), Unit("毫秒" )),
...Microsecond(Integer("0" ), Unit("微秒" )),
...Nanosecond(Integer("0" ), Unit("纳秒" )),
],
},
],
}
],
};
for (let [locale, list] of Object.entries(tests)) {
for (let {options, data} of list) {
let df = new Intl.DurationFormat(locale, options);
for (let {duration, expected} of data) {
let str = PartsToString(expected);
assertEq(df.format(duration), str,
`${locale} [${JSON.stringify(options)}]: ${JSON.stringify(duration)}`);
let parts = df.formatToParts(duration);
assertEq(PartsToString(parts), str,
`${locale} [${JSON.stringify(options)}]: ${JSON.stringify(duration)}`);
assertEq(parts.length, expected.length,
`${locale} [${JSON.stringify(options)}]: ${JSON.stringify(duration)}`);
assertDeepEq(parts, expected);
}
}
}
if (typeof reportCompare === "function" )
reportCompare(true , true );
Messung V0.5 in Prozent C=96 H=83 G=89
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland