使用vanilla JS,是否可以获得月份数组?例如:
['January', ..., 'December']
虽然像 moment.js 这样的库存在并且使用起来比重新发明轮子更有意义,但有时需要/有必要在普通 JS 中实现。
Date.prototype.toLocaleDateString()可以生成月份名称,因此可以生成包含 12 个项目的数组并将每个项目的索引 (0 - 11) 映射到月份名称。
const months = new Array(12).fill(0).map((_, i) => {\r\n return new Date(`${i + 1}/1`).toLocaleDateString(undefined, {month: \'long\'})\r\n});\r\nconsole.log(months);Run Code Online (Sandbox Code Playgroud)\r\n上面的代码记录了月份数组:
\n\n[\n "January",\n "February",\n "March",\n "April",\n "May",\n "June",\n "July",\n "August",\n "September",\n "October",\n "November",\n "December"\n]\nRun Code Online (Sandbox Code Playgroud)\n\n它的工作原理如下:
\n\nnew Array(12)初始化一个长度为 12 的新数组.fill(0)将所有项目初始化为0.map(...)映射所有 12 个0映射数组的(_, i) => { ... }是一个忽略第一个参数(即项目本身,在每种情况下都会是0)并且仅使用索引的函数,该索引来自0到11new Date(`${i + 1}/1`)使用 MM/DD 格式的日期初始化一个新的日期对象,其中月份是基于 1 的索引,月份中的日期始终为1。设置日期是必要的,因为否则它默认为今天的日期,如果它恰好 >28,则该月可能会滚动到下一个(例如,如果今天是 7/31 但 i==2,则日期将初始化为 2 月 31 日,该日期并不存在,因此 Date 对象只生成 5 月的一天).toLocaleDateString(undefined, {month: \'long\'})这就是魔法发生的地方。该对象包含一个formatMatcher对象,该对象控制以字符串形式写出的日期的格式。该month属性设置为\'long\'完整的月份名称(例如"July"生成完整的月份名称(例如 )。有趣的事实:第一个参数未定义,因此它不会覆盖用户的默认区域设置。这太棒了,因为法国的用户会自动看到法语的月份名称:["janvier", "f\xc3\xa9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\xc3\xbbt", "septembre", "octobre", "novembre", "d\xc3\xa9cembre"]\n
如果你想保留英文月份,只需将此参数设置为\'en\'。
如果有帮助的话,这里是使用旧的 JS 语法重写的相同代码:
\n\n[\n "January",\n "February",\n "March",\n "April",\n "May",\n "June",\n "July",\n "August",\n "September",\n "October",\n "November",\n "December"\n]\nRun Code Online (Sandbox Code Playgroud)\r\n| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |