What specification or body controls what date formats are used for locales in Intl.DateTimeFormat?
E.g. What was the process/decision/body that specified that the en-CA date format is 'm/d/yyyy' but the fr-CA one yyyy-mm-dd?
Is there a public standard document I can consume for my own purposes?
Each browser or JS engine determines the internationalization (i18n) formats for each locale.
Per § 21.4.4.38:
21.4.4.38 Date.prototype.toLocaleDateString([reserved1 [, reserved2]])
This method returns a String value. The contents of the String are implementation-defined, but are intended to represent the "date" portion of the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment's current locale.
In this case, Google V8 implementation of the ECMAScript standard defines its own rules that govern the format of dates for a given locale.
I am not sure where Google stores their i18n data for each locale; but according to this Stack Overflow comment, the Unicode CLDR project has been a reliable source for formats. This repository is now archived, but it has been moved to https://github.com/unicode-org/cldr-json.
Note: The V8 developer website states that that Unicode CLDR is the source for Intl.RelativeTimeFormat. Also, after viewing the i18n support page, it looks like V8 requires ICU version 63 at compile time. I have noticed that the V8 mirror on GitHub gets updated from time to time to bump the ICU version.
What's amusing is that the preferred English Canadian format is y-MM-dd, but Google's implementation must be using the alternative variant.
main['en-CA'].dates.calendars.gregorian.dateFormats['short-alt-variant'] → d/M/yymain['fr-CA'].dates.calendars.gregorian.dateFormats.short → y-MM-ddAfter some further investigation, the alternative variant was added between versions 28.0.0 and 29.0.0. This occurred in the last quarter of 2015 and the first quarter of 2016.
{
"dateFormats": {
"full": "EEEE, MMMM d, y",
"long": "MMMM d, y",
"medium": "MMM d, y",
"short": "y-MM-dd"
}
}
{
"dateFormats": {
"full": "EEEE, MMMM d, y",
"long": "MMMM d, y",
"medium": "MMM d, y",
"short": "y-MM-dd",
"short-alt-variant": "d/M/yy"
}
}
Note: The latest version of this code now lives in (unicode-org):
https://github.com/unicode-org/cldr-json/blob/main/cldr-json/cldr-dates-modern/main/en-CA/ca-gregorian.json
According to date-fns, their preferred format is yyyy-MM-dd.
See: https://github.com/date-fns/date-fns/blob/v2.29.3/src/locale/en-CA/_lib/formatLong/index.ts#L8
const dateFormats = {
full: 'EEEE, MMMM do, yyyy',
long: 'MMMM do, yyyy',
medium: 'MMM d, yyyy',
short: 'yyyy-MM-dd',
}
As you can see, each engine or library determines how it implements i18n formats for each locale. Furthermore, these formats evolve and change over time. If you have any questions regarding the format for a given locale, defer to the Unicode CLDR Project.
It's a bug in the Unicode database which has been rolled out during Feb 2023 by automatic updates to Chrome, Edge, Firefox and presumably other browsers, though not Safari at the moment.
refs:
The JS standard says to use CLDR: “Note 3: It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).”
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With