Date.prototype.toLocaleDateString()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

toLocaleDateString() 方法是 Date 实例的一个方法,它返回一个字符串,该字符串是基于本地时区的日期部分的一个语言敏感的表示。在支持 Intl.DateTimeFormat API 的实现中,此方法会委托给 Intl.DateTimeFormat

每次调用 toLocaleDateString 时,都必须在大型本地化字符串数据库中进行搜索,这可能效率低下。当使用相同的参数多次调用该方法时,最好创建一个 Intl.DateTimeFormat 对象并使用其 format() 方法,因为 DateTimeFormat 对象会记住传递给它的参数,并可能决定缓存数据库的一部分,以便将来的 format 调用可以在一个更受限的上下文中搜索本地化字符串。

试一试

const event = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
const options = {
  weekday: "long",
  year: "numeric",
  month: "long",
  day: "numeric",
};

console.log(event.toLocaleDateString("de-DE", options));
// Expected output (varies according to local timezone): Donnerstag, 20. Dezember 2012

console.log(event.toLocaleDateString("ar-EG", options));
// Expected output (varies according to local timezone): الخميس، ٢٠ ديسمبر، ٢٠١٢

console.log(event.toLocaleDateString(undefined, options));
// Expected output (varies according to local timezone and default locale): Thursday, December 20, 2012

语法

js
toLocaleDateString()
toLocaleDateString(locales)
toLocaleDateString(locales, options)

参数

localesoptions 参数自定义函数行为,并允许应用程序指定应使用的语言的格式约定。

在支持 Intl.DateTimeFormat API 的实现中,这些参数与 Intl.DateTimeFormat() 构造函数的参数完全对应。不支持 Intl.DateTimeFormat 的实现则被要求忽略这两个参数,使得所使用的区域设置和返回字符串的格式完全取决于具体实现。

locales 可选

一个带有 BCP 47 语言标签 的字符串,或此类字符串的数组。对应于 Intl.DateTimeFormat() 构造函数的 locales 参数。

在不支持 Intl.DateTimeFormat 的实现中,将忽略此参数,通常会使用主机的区域设置。

options 可选

一个调整输出格式的对象。对应于 Intl.DateTimeFormat() 构造函数的 options 参数。timeStyle 选项必须是 undefined,否则将抛出 TypeError。如果 weekdayyearmonthday 都为 undefined,则 yearmonthday 将被设置为 "numeric"

在不支持 Intl.DateTimeFormat 的实现中,将忽略此参数。

有关这些参数及其使用方法的详细信息,请参阅 Intl.DateTimeFormat() 构造函数

返回值

一个字符串,表示给定日期的日期部分,根据语言特定的约定。

在支持 Intl.DateTimeFormat 的实现中,这等同于 new Intl.DateTimeFormat(locales, options).format(date),其中 options 已按上述方式规范化。

注意: 大多数情况下,toLocaleDateString() 返回的格式是一致的。然而,在不同实现之间,甚至在同一区域设置下,输出都可能有所不同——输出差异是设计使然,并且被规范允许。它也可能不是您期望的。例如,字符串可能使用不间断空格,或者被双向控制字符包围。您不应该将 toLocaleDateString() 的结果与硬编码的常量进行比较。

示例

使用 toLocaleDateString()

不指定 locale 的此方法的简单用法以默认区域设置和默认选项返回格式化字符串。

js
const date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0));

// toLocaleDateString() without arguments depends on the implementation,
// the default locale, and the default time zone
console.log(date.toLocaleDateString());
// "12/11/2012" if run in en-US locale with time zone America/Los_Angeles

检查对 locales 和 options 参数的支持

localesoptions 参数可能并非在所有实现中都得到支持,因为国际化 API 的支持是可选的,并且某些系统可能没有必要的数据。对于不支持国际化的实现,toLocaleDateString() 始终使用系统的区域设置,这可能不是您想要的。因为任何支持 localesoptions 参数的实现都必须支持 Intl API,所以您可以检查后者是否存在以判断支持情况。

js
function toLocaleDateStringSupportsLocales() {
  return (
    typeof Intl === "object" &&
    !!Intl &&
    typeof Intl.DateTimeFormat === "function"
  );
}

使用语言环境

此示例显示了本地化日期格式的一些变体。为了获取应用程序用户界面所用语言的格式,请确保使用 locales 参数指定该语言(以及可能的备用语言)。

js
const 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(date.toLocaleDateString("en-US"));
// "12/20/2012"

// British English uses day-month-year order
console.log(date.toLocaleDateString("en-GB"));
// "20/12/2012"

// Korean uses year-month-day order
console.log(date.toLocaleDateString("ko-KR"));
// "2012. 12. 20."

// Event for Persian, It's hard to manually convert date to Solar Hijri
console.log(date.toLocaleDateString("fa-IR"));
// "۱۳۹۱/۹/۳۰"

// Arabic in most Arabic speaking countries uses real Arabic digits
console.log(date.toLocaleDateString("ar-EG"));
// "٢٠‏/١٢‏/٢٠١٢"

// for Japanese, applications may want to use the Japanese calendar,
// where 2012 was the year 24 of the Heisei era
console.log(date.toLocaleDateString("ja-JP-u-ca-japanese"));
// "24/12/20"

// when requesting a language that may not be supported, such as
// Balinese, include a fallback language, in this case Indonesian
console.log(date.toLocaleDateString(["ban", "id"]));
// "20/12/2012"

使用选项

toLocaleDateString() 提供的结果可以使用 options 参数进行自定义。

js
const date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

// Request a weekday along with a long date
const options = {
  weekday: "long",
  year: "numeric",
  month: "long",
  day: "numeric",
};
console.log(date.toLocaleDateString("de-DE", options));
// "Donnerstag, 20. Dezember 2012"

// An application may want to use UTC and make that visible
options.timeZone = "UTC";
options.timeZoneName = "short";
console.log(date.toLocaleDateString("en-US", options));
// "Thursday, December 20, 2012, UTC"

规范

规范
ECMAScript® 2026 语言规范
# sec-date.prototype.tolocaledatestring
ECMAScript® 2026 国际化 API 规范
# sup-date.prototype.tolocaledatestring

浏览器兼容性

另见