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.shorty-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 Overflow
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › Intl › DateTimeFormat › supportedLocalesOf
Intl.DateTimeFormat.supportedLocalesOf() - JavaScript | MDN
The Intl.DateTimeFormat.supportedLocalesOf() static method returns an array containing those of the provided locales that are supported in date and time formatting without having to fall back to the runtime's default locale.
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › Intl › DateTimeFormat › DateTimeFormat
Intl.DateTimeFormat() constructor - JavaScript - MDN Web Docs
January 21, 2026 - In basic use without specifying a locale, DateTimeFormat uses the default locale and default options. ... const date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0)); // toLocaleString without arguments depends on the implementation, // the default locale, and the default time zone console.log(new Intl.DateTimeFormat().format(date)); // "12/19/2012" if run with en-US locale (language) and time zone America/Los_Angeles (UTC-0800)
Discussions

What controls the date format for a locale in Intl.DateTimeFormat?
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' bu... More on stackoverflow.com
🌐 stackoverflow.com
Date and DateTime Formats based on Locale
It's as stated in MDN document: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#parameters i.e. if it's a string, it's a BCP 47 language tag. So search the specification for BCP 47. Also check Wikipedia article. More on reddit.com
🌐 r/learnjavascript
5
1
October 16, 2024
Browser default locale - Intl.DateTimeFormat vs navigator.language
When coding a website and formatting a date, I want to use the locale that the user has set in their browser. So for example, if a user has customised their chrome://settings/languages setting in ... More on stackoverflow.com
🌐 stackoverflow.com
Ability to specify a custom format for Intl.DateTimeFormat
As best I can tell, Intl.DateTimeFormat doesn't have any ability to specify the exact format string to use. Instead it is always based upon the locale with the ability to customise individual portions of the produced string. More on github.com
🌐 github.com
18
March 10, 2021
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › Intl › DateTimeFormat
Intl.DateTimeFormat - JavaScript - MDN Web Docs
Creates a new Intl.DateTimeFormat object. ... Returns an array containing those of the provided locales that are supported without having to fall back to the runtime's default locale.
🌐
DEV Community
dev.to › rsa › perfectly-localizing-date-time-with-intl-datetimeformat-ack
Perfectly localizing date & time with Intl.DateTimeFormat - DEV Community
December 3, 2020 - All of these functions take the same attributes the constructor for DateTimeFormat takes: locale and options. Let's see what those are. The first parameter, locales, is one or a list of possible locales for negotiation. Language negotiation is an intricate subject, and I don't want to dive into it yet, so check the MDN reference if you need details. Here are some examples of how the locale will change the output: const dtf = new Intl.DateTimeFormat(); dtf.format(date); //=> "11/5/2020" // equivalent to date.toLocaleDateString()
Top answer
1 of 2
4

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.shorty-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.

2 of 2
2

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/).”

🌐
Format.JS
formatjs.github.io › docs › polyfills › intl-datetimeformat
Intl Datetimeformat | FormatJS
You can use polyfill-fastly.io ... not come with any locale data. In order to add locale data, append Intl.DateTimeFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features....
🌐
Devhints
devhints.io › hidden › intl.datetimeformat cheatsheet
Intl.DateTimeFormat cheatsheet
April 20, 2018 - console.log(new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'numeric', day: 'numeric' }).format(date)) // → '12/19/2012' To specify options without a locale, use 'default' as a locale.
🌐
Tryhoverify
tryhoverify.com › blog › intldatetimeformat-for-localization
Intl.DateTimeFormat for Localization | Hoverify
May 1, 2025 - Supports over 150 locales. Built-in time zone handling with IANA identifiers. Flexible customization for date and time components. Whether you’re building a global app or handling time zones, Intl.DateTimeFormat ensures accurate, user-friendly date localization.
Find elsewhere
🌐
Titaniumsdk
titaniumsdk.com › api › global › intl › datetimeformat.html
Global.Intl.DateTimeFormat | Titanium SDK
Array containing a subset of the given locale strings supported by DateTimeFormat objects.
🌐
Reddit
reddit.com › r/learnjavascript › date and datetime formats based on locale
r/learnjavascript on Reddit: Date and DateTime Formats based on Locale
October 16, 2024 -

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/2014

  • da-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.

🌐
GeeksforGeeks
geeksforgeeks.org › javascript › javascript-intl-datetimeformat-supportedlocalesof-method
JavaScript Intl DateTimeFormat supportedLocalesOf() Method - GeeksforGeeks
July 12, 2025 - The Intl.DateTimeFormat.supportedLocalesOf() method is an inbuilt method in JavaScript that returns an array containing those of the provided locales that are supported in date and time formatting.
Top answer
1 of 3
15

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.

2 of 3
10

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:

  1. A list of languages in order of preference. This appears to drive navigator.languages.
  2. 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.

🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › Intl
Intl - JavaScript - MDN Web Docs - Mozilla
If a locale identifier is well-formed ... in the list is considered, eventually falling back to the system's locale. However, you shouldn't rely on a particular locale name being ignored, because the implementation may add data for any locale in the future. For example, new Intl.DateTimeFormat("default") ...
🌐
Codeproject
reference.codeproject.com › javascript
javascript Intl.DateTimeFormat - CodeProject Reference
November 5, 2021 - var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0)); // formats below assume the local time zone of the locale; // America/Los_Angeles for the US // US English uses month-day-year order console.log(new Intl.DateTimeFormat('en-US').format(date)); // → "12/19/2012" // British English uses day-month-year order console.log(new Intl.DateTimeFormat('en-GB').format(date)); // → "20/12/2012" // Korean uses year-month-day order console.log(new Intl.DateTimeFormat('ko-KR').format(date)); // → "2012.
🌐
CodingNomads
codingnomads.com › formatting-dates-and-times-javascript-intl
Formatting Dates and Times in JavaScript Using Intl
That the Intl object is a tool for formatting dates, numbers, and lists, supporting many locales and options. To treat dates as UTC internally to maintain consistency and only convert to local times when necessary, although sometimes different internal time zones are unavoidable. How to create a DateTimeFormat object by passing a locale string and then use its .format() method to output a formatted date.
🌐
GitHub
github.com › prantlf › datetime-locale-patterns
GitHub - prantlf/datetime-locale-patterns: Provides localized date/time format patterns for styles full, long, medium and short, usable with Intl.DateTimeFormat, compliant with Unicode LDML.
Provides localized date/time format patterns for styles full, long, medium and short, usable with Intl.DateTimeFormat, compliant with Unicode LDML. - prantlf/datetime-locale-patterns
Author   prantlf
🌐
DEV Community
dev.to › diorla › a-guide-to-date-and-time-formatting-in-javascript-2ol2
A Guide to Date and Time Formatting in JavaScript - DEV Community
September 3, 2023 - Format dates and times according to user preferences or specific locales. Display dates and times in a human-readable format. Customize the formatting of date and time components. Let's start with the basics of using Intl.DateTimeFormat. To create a new instance of this object, you simply pass one or more locale strings as arguments.
🌐
GitHub
github.com › tc39 › ecma402 › issues › 554
Ability to specify a custom format for Intl.DateTimeFormat · Issue #554 · tc39/ecma402
March 10, 2021 - As best I can tell, Intl.DateTimeFormat doesn't have any ability to specify the exact format string to use. Instead it is always based upon the locale with the ability to customise individual portions of the produced string.
Author   sazzer
🌐
University of New Brunswick
cs.unb.ca › ~bremner › teaching › cs2613 › books › mdn › Reference › Global_Objects › Intl › DateTimeFormat
Intl.DateTimeFormat
In order to get the format of the language used in the user interface of your application, make sure to specify that language (and possibly some fallback languages) using the locales argument: const date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0)); // Results below use the time zone of America/Los_Angeles (UTC-0800, Pacific Standard Time) // US English uses month-day-year order console.log(new Intl.DateTimeFormat("en-US").format(date)); // "12/19/2012" // British English uses day-month-year order console.log(new Intl.DateTimeFormat("en-GB").format(date)); // "19/12/2012" // Korean uses year-month-day order console.log(new Intl.DateTimeFormat("ko-KR").format(date)); // "2012.
🌐
amCharts
amcharts.com › docs › v5 › tutorials › formatting-date-time-and-numbers-using-intl-object
Formatting date/time and numbers using “Intl” object – amCharts 5 Documentation
If we want browser's Intl object to format it instead, we will set it to an object, e.g.: root.dateFormatter.set("dateFormat", { weekday: "long", year: "numeric", month: "long", day: "numeric" }); root.dateFormatter.set("dateFormat", { weekday: "long", year: "numeric", month: "long", day: "numeric" }); IMPORTANTBy default date/time will be formatted to user's default locale specified in OS. We can override it by providing our own list of locale codes.