For custom-delimited date formats, you have to pull out the date (or time) components from a DateTimeFormat
object (which is part of the ECMAScript Internationalization API), and then manually create a string with the delimiters you want.
To do this, you can use DateTimeFormat#formatToParts
. You could destructure the array, but that is not ideal, as the array output depends on the locale:
{ // example 1 let f = new Intl.DateTimeFormat('en'); let a = f.formatToParts(); console.log(a); } { // example 2 let f = new Intl.DateTimeFormat('hi'); let a = f.formatToParts(); console.log(a); }
Run code snippet
Better would be to map a format array to resultant strings:
function join(t, a, s) { function format(m) { let f = new Intl.DateTimeFormat('en', m); return f.format(t); } return a.map(format).join(s); } let a = [{day: 'numeric'}, {month: 'short'}, {year: 'numeric'}]; let s = join(new Date, a, '-'); console.log(s);
Run code snippet
You can also pull out the parts of a DateTimeFormat
one-by-one using DateTimeFormat#format
, but note that when using this method, as of March 2020, there is a bug in the ECMAScript implementation when it comes to leading zeros on minutes and seconds (this bug is circumvented by the approach above).
let d = new Date(2010, 7, 5); let ye = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(d); let mo = new Intl.DateTimeFormat('en', { month: 'short' }).format(d); let da = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(d); console.log(`${da}-${mo}-${ye}`);
Run code snippet
When working with dates and times, it is usually worth using a library (eg. moment.js, luxon) because of the many hidden complexities of the field.
Note that the ECMAScript Internationalization API, used in the solutions above is not supported in IE10 (0.03% global browser market share in Feb 2020).