是否可以使用普通 JavaScript 获取所有月份的列表?

Ric*_*omi 2 javascript

使用vanilla JS,是否可以获得月份数组?例如:

['January', ..., 'December']

虽然像 moment.js 这样的库存在并且使用起来比重新发明轮子更有意义,但有时需要/有必要在普通 JS 中实现。

Ric*_*omi 7

Date.prototype.toLocaleDateString()可以生成月份名称,因此可以生成包含 12 个项目的数组并将每个项目的索引 (0 - 11) 映射到月份名称。

\n\n

\r\n
\r\n
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
\r\n
\r\n

\n\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]\n
Run Code Online (Sandbox Code Playgroud)\n\n

它的工作原理如下:

\n\n
    \n
  • new Array(12)初始化一个长度为 12 的新数组
  • \n
  • 在定义了某些项目之前,无法映射数组,因此.fill(0)将所有项目初始化为0
  • \n
  • .map(...)映射所有 12 个0映射数组的
  • \n
  • (_, i) => { ... }是一个忽略第一个参数(即项目本身,在每种情况下都会是0)并且仅使用索引的函数,该索引来自011
  • \n
  • new Date(`${i + 1}/1`)使用 MM/DD 格式的日期初始化一个新的日期对象,其中月份是基于 1 的索引,月份中的日期始终为1。设置日期是必要的,因为否则它默认为今天的日期,如果它恰好 >28,则该月可能会滚动到下一个(例如,如果今天是 7/31 但 i==2,则日期将初始化为 2 月 31 日,该日期并不存在,因此 Date 对象只生成 5 月的一天)
  • \n
  • .toLocaleDateString(undefined, {month: \'long\'})这就是魔法发生的地方。该对象包含一个formatMatcher对象,该对象控制以字符串形式写出的日期的格式。该month属性设置为\'long\'完整的月份名称(例如"July"生成完整的月份名称(例如 )。有趣的事实:第一个参数未定义,因此它不会覆盖用户的默认区域设置。这太棒了,因为法国的用户会自动看到法语的月份名称:
  • \n
\n\n

["janvier", "f\xc3\xa9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\xc3\xbbt", "septembre", "octobre", "novembre", "d\xc3\xa9cembre"]\n

\n\n

如果你想保留英文月份,只需将此参数设置为\'en\'

\n\n
\n\n

如果有帮助的话,这里是使用旧的 JS 语法重写的相同代码:

\n\n

\r\n
\r\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]\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

  • 你是在发帖后 5 秒才回答自己的问题吗? (3认同)