现代方式
现代的做法是使用toLocaleDateString
,因为它不仅可以使日期格式化本地化,还可以传递格式选项以达到所需的结果:
const date = new Date(2018, 2, 1)
const result = date.toLocaleDateString("en-GB", {
year: "numeric",
month: "2-digit",
day: "2-digit",
})
console.log(result)
或者使用一个时间对象(仍在提案中, 可以使用):
const date = new Temporal.PlainDate(2018, 3, 1)
const result = date.toLocaleString("en-GB", {
year: "numeric",
month: "2-digit",
day: "2-digit",
})
console.log(result)
当您使用
undefined
作为第一个参数时,它会检测浏览器语言。或者,您也可以在年份选项中使用
2-digit
。
性能方面,如果您打算格式化许多日期,建议使用
Intl.DateTimeFormat
代替。
const formatter = new Intl.DateTimeFormat("en-GB", {
year: "numeric",
month: "2-digit",
day: "2-digit",
})
const date = new Date(2018, 2, 1)
const result = formatter.format(date)
console.log(result)
该格式化程序兼容于日期和时间对象。
历史日期
与Temporal构造函数不同,Date构造函数中0到99年将被解释为20世纪的年份。为了防止这种情况发生,请按以下方式初始化日期:
const date = new Date()
date.setFullYear(18, 2, 1)
这不是Temporal对象必需的,但在某些情况下,年份低于1000时将不包含前导零,因为格式化程序(该程序用于Date和Temporal API)根本不支持4位数字格式。在这种情况下,您需要进行手动格式化(请参见下文)。
对于ISO 8601格式,如果您想以YYYY-MM-DD格式(ISO 8601)获取日期,则解决方案看起来不同:
const date = new Date(Date.UTC(2018, 2, 1))
const result = date.toISOString().split('T')[0]
console.log(result)
您输入的日期应该采用UTC格式,或者toISOString()
可以为您解决此问题。如上所示,使用Date.UTC
实现。
ISO 8601格式下的历史日期
与Temporal构造函数不同,在Date构造函数中0到99年将被解释为20世纪的年份。为了避免这种情况,请按以下方式初始化日期以用于ISO 8601格式:
const date = new Date()
date.setUTCFullYear(18, 2, 1)
请注意,年份在公元1000年之前或公元9999年之后的时间对象的ISO格式与旧版Date API有
不同的格式。建议在所有情况下回退到自定义格式以强制使用4位数的年份。
年份的自定义4位数格式
很遗憾,格式化程序不支持年份前导零。没有
4-digit
选项。这也适用于Temporal对象,因为它们共享相同的格式化程序。
幸运的是,Date API的ISO格式将始终显示至少4个数字的年份,尽管Temporal对象不会。因此,至少对于Date API,您可以通过回退到使用ISO 8601格式方法的一部分的手动格式化方法来格式化1000年之前的历史日期并添加前导零:
const date = new Date()
date.setUTCFullYear(18, 2, 1)
const ymd = date.toISOString().split('T')[0].split('-')
const result = `${ymd[2]}/${ymd[1]}/${ymd[0]}`
console.log(result)
对于时间对象,需要不同的处理方式,因为如前所述,ISOYearString
在公元1000年之前和9999年之后的日期格式不同:
const date = new Temporal.PlainDate(2018, 3, 1)
const zeroPad = (n, digits) => n.toString().padStart(digits, '0');
const result = `${zeroPad(date.day, 2)}/${zeroPad(date.month, 2)}/${zeroPad(date.year, 4)}`;
console.log(result)
杂项
对于日期和时间 API,还有toLocaleTimeString
,它允许您本地化并格式化日期的时间。
padStart
答案 - technogeek1995