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.
What does Google use?
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.
- en-CA/ca-gregorian.json (line 327)
main['en-CA'].dates.calendars.gregorian.dateFormats['short-alt-variant']→d/M/yy
- fr-CA/ca-gregorian.json (line 314)
main['fr-CA'].dates.calendars.gregorian.dateFormats.short→y-MM-dd
Unicode CLDR
After 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.
Version 28.0.0
- Dated: 17 September 2015
- Tag: https://github.com/unicode-cldr/cldr-dates-modern/releases/tag/28.0.0
- See: https://github.com/unicode-cldr/cldr-dates-modern/blob/28.0.0/main/en-CA/ca-gregorian.json#L327
{
"dateFormats": {
"full": "EEEE, MMMM d, y",
"long": "MMMM d, y",
"medium": "MMM d, y",
"short": "y-MM-dd"
}
}
Version 29.0.0
- Dated: 17 March 2016
- Tag: https://github.com/unicode-cldr/cldr-dates-modern/releases/tag/29.0.0
- See: https://github.com/unicode-cldr/cldr-dates-modern/blob/29.0.0/main/en-CA/ca-gregorian.json#L327
{
"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
date-fns
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',
}
Summary
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.
Answer from Mr. Polywhirl on Stack OverflowWhat controls the date format for a locale in Intl.DateTimeFormat?
Date and DateTime Formats based on Locale
Browser default locale - Intl.DateTimeFormat vs navigator.language
Ability to specify a custom format for Intl.DateTimeFormat
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.
What does Google use?
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.
- en-CA/ca-gregorian.json (line 327)
main['en-CA'].dates.calendars.gregorian.dateFormats['short-alt-variant']→d/M/yy
- fr-CA/ca-gregorian.json (line 314)
main['fr-CA'].dates.calendars.gregorian.dateFormats.short→y-MM-dd
Unicode CLDR
After 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.
Version 28.0.0
- Dated: 17 September 2015
- Tag: https://github.com/unicode-cldr/cldr-dates-modern/releases/tag/28.0.0
- See: https://github.com/unicode-cldr/cldr-dates-modern/blob/28.0.0/main/en-CA/ca-gregorian.json#L327
{
"dateFormats": {
"full": "EEEE, MMMM d, y",
"long": "MMMM d, y",
"medium": "MMM d, y",
"short": "y-MM-dd"
}
}
Version 29.0.0
- Dated: 17 March 2016
- Tag: https://github.com/unicode-cldr/cldr-dates-modern/releases/tag/29.0.0
- See: https://github.com/unicode-cldr/cldr-dates-modern/blob/29.0.0/main/en-CA/ca-gregorian.json#L327
{
"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
date-fns
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',
}
Summary
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:
- https://github.com/unicode-org/cldr/blame/main/common/main/en_CA.xml#L1184
- https://unicode-org.atlassian.net/browse/CLDR-16399 which in turns references the bug in the chromium project
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/).”
Hello, everyone!
I’m looking for a comprehensive database or URL that provides detailed information on locale-specific date formatting conventions, similar to those used by MDN’s Intl.DateTimeFormat. Specifically, I need a resource that lists standardized formats for various locales, such as:
en-US:
1/1/2014da-DK:
01.02.2014
Does anyone know where I can find a complete list or database with this kind of information? Ideally, I’d like something reliable that covers all supported locales and their default date formats.
I'm using macOS and found that Chrome's navigator.languages reflects the browser language setting while Intl.DateTimeFormat().resolvedOptions().locale reflects the OS language setting. Don't know if this is also the case in other OSs.
I also saw this and have done a bit of testing.
Chrome
On Windows Chrome 85 appears offers two different ways to set the language in it's configuration:
- A list of languages in order of preference. This appears to drive
navigator.languages. - A language which is used to "display the Google Chrome UI". This appears to drive
Intl.DateTimeFormat().resolvedOptions().locale.
For example when I have this set:

I get this:
navigator.languages : en-US, en-GB, en
navigator.language : en-US
Intl.DateTimeFormat().resolvedOptions().locale : en-GB
Note that on Mac with Chrome 85 there did not appear to be these two separate settings, but just the ability to set an order of languages (not an option for setting the language to "display the Google Chrome UI").
Node
In Node I found that the value of Intl.DateTimeFormat().resolvedOptions().locale was driven by the language settings of my operating system. Note I only tested this on Windows, but I assume the same is true elsewhere.
Side note on time zone
I saw that for Intl.DateTimeFormat().resolvedOptions().timeZone both Chrome and Node use the OS setting for the time zone (also only tested on Windows). Chrome does not appear to have its own setting for time zone in its settings so I guess just uses the OS configuration.