Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to format Milliseconds with Intl.DateTimeFormat API

I need to format a Timestamp in a specific locale (not utc, not browser locale). But I must have the millisecond part of the date, too. My first attempt was second:'numeric' with the DateTimeFormat API:

new Intl.DateTimeFormat(
    'de-de', // german as an example, user selectable
    { 
        year: 'numeric', month: 'numeric',  day: 'numeric', 
        hour: 'numeric', minute: 'numeric', 
        second: 'numeric',
        hour12: false
    }
)
.format(new Date()); // Date as an example

But the result is something like "26.11.2018, 09:31:04" and not "26.11.2018, 09:31:04,243".

Is there a easier possibility than using formatToParts() and detect the missing millisecond and add it again with the Intl.NumberFormat?

Attention: If someone needs to implement this, Microsoft browsers are adding Left-To-Right-Mark Unicode chars into the output. So you can not parseInt the result from formatToParts() without sanitizing.

Edit: Moved the question to https://github.com/tc39/ecma402/issues/300

like image 688
HolgerJeromin Avatar asked Nov 26 '18 08:11

HolgerJeromin


1 Answers

This is now spec'ed and implemented in Chrome and Firefox:

https://github.com/tc39/ecma402/issues/300

https://caniuse.com/mdn-javascript_builtins_intl_datetimeformat_datetimeformat_fractionalseconddigits

new Date().toLocaleString('de-de', { year: 'numeric', month: 'numeric',  day: 'numeric', 
        hour: 'numeric', minute: 'numeric', 
        second: 'numeric',
        fractionalSecondDigits: 3
    }
)
// or
new Intl.DateTimeFormat(
    'de-de', // german as an example, user selectable
    { 
        year: 'numeric', month: 'numeric',  day: 'numeric', 
        hour: 'numeric', minute: 'numeric', 
        second: 'numeric', fractionalSecondDigits: 3,
        hour12: false
    }
)
.format(new Date());
// => "6.1.2021, 12:30:52,719"
like image 190
HolgerJeromin Avatar answered Nov 10 '22 16:11

HolgerJeromin