This is very close to being off–topic as opinion based, but here goes anyway.

Which one of these should I use?

Date.prototype.toLocaleString was originally solely implementation dependent and varied quite a bit across browsers. When support for the Intl object was added (ECMAScript 2015, ed 6) then toLocaleString was allowed to support the same options. While support isn't mandated by ECMA-262, probably all current implementations support it.

Note that this did not remove the allowed implementation variability, it just provided some formatting options based on language, region and dialect (and also timezone options based on the IANA time zone database identifiers and values).

The Intl object (and hence toLocaleString) is based on ECMA-402, which doesn't strictly specify formatting, so there is still some room for implementations to differ. The biggest differences are in regard to timezone names (for which there is no standard) and placement of commas, spaces, etc.

However, for most practical purposes, whether you use the Intl object or toLocaleString is up to you, I don't think there's any technical reason to prefer one over the other. While the results for both should be identical for a particular implementation, don't expect the resulting string to be exactly identical across implementations or to conform to a particular format for a given BCP 47 language tag.

Answer from RobG on Stack Overflow
🌐
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 - const date = new Date(Date.UTC(2012, ... once. For example, for en-US, dateStyle: "short" is equivalent to setting year: "2-digit", month: "numeric", day: "numeric", and timeStyle: "short" is equivalent to setting hour: "numeric", minute: "numeric"....
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › Intl › DateTimeFormat
Intl.DateTimeFormat - JavaScript - MDN Web Docs
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 ...
🌐
Devhints
devhints.io › hidden › intl.datetimeformat cheatsheet
Intl.DateTimeFormat cheatsheet
April 20, 2018 - console.log(new Intl.DateTimeFormat('en-AU', { timeZone: 'Australia/Sydney' }).format(date)) // → '19/12/2012'
🌐
DEV Community
dev.to › josephciullo › crush-date-and-time-formatting-natively-unleash-the-hidden-power-of-intldatetimeformat-4b2g
Crush Date and Time Formatting Natively: Unleash the Hidden Power of Intl.DateTimeFormat - DEV Community
January 27, 2025 - While it is common to save the formatter instance in a variable for reuse, this step is not strictly required. The Intl.DateTimeFormat constructor can be invoked directly to format dates inline, as shown below:
🌐
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 - 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()
🌐
GeeksforGeeks
geeksforgeeks.org › javascript › javascript-intl-datetimeformat-format-method
JavaScript Intl DateTimeFormat format() Method - GeeksforGeeks
July 12, 2025 - const Geeks = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }; const dateformat = new Date(1997, 06, 30); const dateTimeFormat4 = new Intl.DateTimeFormat('hi', Geeks); console.log(dateTimeFormat4.format(dateformat)); const ...
🌐
GitHub
github.com › zapier › intl-dateformat
GitHub - zapier/intl-dateformat: Format a date using Intl.DateTimeFormat goodness.
import formatDate from 'intl-dateformat' const date = new Date(Date.UTC(1984, 0, 17, 16, 13, 37, 0)) formatDate(date, 'YYYY-MM-DD hh:mm:ss A') // → 1984-01-17 04:13:37 PM
Starred by 62 users
Forked by 7 users
Languages   TypeScript 94.2% | JavaScript 5.8% | TypeScript 94.2% | JavaScript 5.8%
Find elsewhere
Top answer
1 of 4
27

This is very close to being off–topic as opinion based, but here goes anyway.

Which one of these should I use?

Date.prototype.toLocaleString was originally solely implementation dependent and varied quite a bit across browsers. When support for the Intl object was added (ECMAScript 2015, ed 6) then toLocaleString was allowed to support the same options. While support isn't mandated by ECMA-262, probably all current implementations support it.

Note that this did not remove the allowed implementation variability, it just provided some formatting options based on language, region and dialect (and also timezone options based on the IANA time zone database identifiers and values).

The Intl object (and hence toLocaleString) is based on ECMA-402, which doesn't strictly specify formatting, so there is still some room for implementations to differ. The biggest differences are in regard to timezone names (for which there is no standard) and placement of commas, spaces, etc.

However, for most practical purposes, whether you use the Intl object or toLocaleString is up to you, I don't think there's any technical reason to prefer one over the other. While the results for both should be identical for a particular implementation, don't expect the resulting string to be exactly identical across implementations or to conform to a particular format for a given BCP 47 language tag.

2 of 4
11

If you re-use the same format a lot of times, re-using Intl.DateTimeFormat object seems to be better from a performance perspective.

const format =  {
    weekday: 'long',
    month: 'long',
    day: '2-digit',
};
const dateTimeFormat = new Intl.DateTimeFormat('en', format);
const start1 = performance.now();
for (let i = 0; i < 10000; i++) dateTimeFormat.format(new Date());
console.log('re-use Intl.DateTimeFormat', performance.now() - start1);

const start2 = performance.now();
for (let i = 0; i < 10000; i++) new Date().toLocaleString('en', format);
console.log('use toLocaleString', performance.now() - start2);

When I run this snippet in Chrome 105, it gives me a result like this:

re-use Intl.DateTimeFormat 17.299999952316284
use toLocaleString 876.0999999046326
🌐
Rafaelcamargo
rafaelcamargo.com › blog › mastering-date-formatting-using-intl-date-time-format-in-javascript
Mastering date formatting using Intl.DateTimeFormat in JavaScript
May 29, 2024 - const date = new Date(2024, 3, 29, 0); const opts = { day: 'numeric', year: 'numeric' }; Intl.DateTimeFormat('en-US', { ...opts, month: 'long' }).format(date); // → April 29, 2024 Intl.DateTimeFormat('en-US', { ...opts, month: 'short' }).format(date); // → Apr 29, 2024 Intl.DateTimeFor...
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › Intl › DateTimeFormat › format
Intl.DateTimeFormat.prototype.format() - JavaScript | MDN
July 20, 2025 - const options = { weekday: "long", year: "numeric", month: "long", day: "numeric", }; const date = new Date(2012, 5); const dateTimeFormat1 = new Intl.DateTimeFormat("sr-RS", options); console.log(dateTimeFormat1.format(date)); // Expected output: "петак, 1.
🌐
Valentino G.
valentinog.com › blog › datetime
Formatting dates in JavaScript with Intl.DateTimeFormat
February 7, 2020 - This code will produce a time tag with an ISO string, the text "Published on" and nothing more. But we can use Intl.DateTimeFormat with the appropriate locale for converting to an american date:
🌐
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)); ...
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › Intl › DateTimeFormat › formatToParts
Intl.DateTimeFormat.prototype.formatToParts() - JavaScript | MDN
For example, the options below sets month to "long" and results in a yearName token, despite year still being "numeric": ... const opts = { year: "numeric", month: "long", day: "numeric" }; const df = new Intl.DateTimeFormat("zh-u-ca-chinese", opts); df.formatToParts(Date.UTC(2012, 11, 17, ...
🌐
GitHub
github.com › tc39 › ecma402 › issues › 554
Ability to specify a custom format for Intl.DateTimeFormat · Issue #554 · tc39/ecma402
March 10, 2021 - > new Intl.DateTimeFormat('en-CA', {dateStyle: 'medium', timeStyle: 'medium'}).format(new Date()); 'Mar. 10, 2021, 4:13:32 p.m.' However, if you want to make subtle changes to that then you're in trouble.
Author   sazzer
🌐
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 - One of the most powerful features of Intl.DateTimeFormat is the ability to customize how dates and times are formatted. You can do this by providing an options object as the second argument when creating an instance of Intl.DateTimeFormat. ... This is the first argument, and these are the various locale that are supported, examples could be found here
🌐
Tryhoverify
tryhoverify.com › blog › intldatetimeformat-for-localization
Intl.DateTimeFormat for Localization | Hoverify
May 1, 2025 - The Intl.DateTimeFormat constructor lets you adjust the format with two main options: dateStyle and timeStyle.
🌐
Format.JS
formatjs.github.io › docs › polyfills › intl-datetimeformat
Intl Datetimeformat | FormatJS
import '@formatjs/intl-datetimeformat/polyfill.js' import '@formatjs/intl-datetimeformat/add-golden-tz.js' This polyfill supports UTC offset timezone identifiers as specified in ECMA-402 (ES2026). You can use offset-based timezone strings in addition to IANA timezone names. ... All offset formats are automatically canonicalized to ±HH:MM format (with seconds/fractional seconds preserved if non-zero). import '@formatjs/intl-datetimeformat/polyfill.js' import '@formatjs/intl-datetimeformat/locale-data/en.js' // Using UTC offset timezone const formatter = new Intl.DateTimeFormat('en-GB', { timeZ
🌐
MDN Web Docs
devdoc.net › web › developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Global_Objects › DateTimeFormat.html
Intl.DateTimeFormat - JavaScript | MDN
var 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/20/2012" if run in en-US locale with time zone ...