使用原生JavaScript格式化日期
原文:Format Dates Using Vanilla JavaScript
学习使用toLocaleString()
函数格式化日期,不用外部库。
JavaScript有许多像moment这样的库,可以格式化日期。然而对于基本的日期格式化而言,你并不需要它们:内置的Date#toLocaleString()函数可以不用外部库,转换为自定义的字符串格式。
toLocaleString()介绍
toLocaleString()
函数接收2个参数:
一个字符串参数
locale
,代表日期的地区格式,例如'en-US'
或'default'
。一个对象参数
options
,包含日期的不同部分如何格式化,例如month
或minutes
,见toLocaleDateString()
的options参数完整列表。
以下是一个日期格式化的例子,包含短周和完整日期。
1 | // 结尾不带'Z',JavaScript不会使用相对于UTC的时区。 |
注意:别把toLocaleString()
和toLocaleDateString()
搞混了。toLocaleDateString()
函数和toLocaleString()
很相似,但它默认不包含日期中的时间部分。
1 | const date = new Date('2019-06-01T08:00:00.000'); |
时区
toLocaleString()
函数可以在格式化日期时指定时区。支持的时区是基于实现的,所以必须先在具体的环境中进行测试,才能使用像'America/Los_Angeles'
或'America/New_York'
这样的时区名。例如,Node.js从操作系统读取时区数据,这意味着Node进程很大可能是包含时区数据的,但并不能绝对保证。
以下是使用一个特定时区——'America/Denver'
——格式化UTC日期的例子。
1 | const date = new Date('2019-06-01T08:00:00.000Z'); |
限制
toLocaleString()
函数对于简单的、人类可读的格式化已经满足使用,但它不能提供moment
那种级别的控制。
例如,toLocaleString()
不能输出YYYYMMDD
格式的日期,例如’20190601’。它可以输出YYYY-MM-DD
格式的日期,但环境中必须有合适的区域。’en-US’区域不能输出YYYY-MM-DD格式,但’fr-CA’可以。
1 | const date = new Date('2019-06-01T00:00:00.000'); |
不好的是,猜到正确的区域需要试错。如果你需要比'June 1, 2019'
更强好的日期格式化,你可以使用moment。
译注:moment.js已停止更新,moment.js官方建议使用day.js等“现代”的库。