从日期获取月份名称

IT技术 javascript date date-format time-format
2021-01-16 12:30:51

如何在 JavaScript 中从这个日期对象生成月份的名称(例如:Oct/October)?

var objDate = new Date("10/11/2009");
6个回答

较短的版本:

const monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];

const d = new Date();
document.write("The current month is " + monthNames[d.getMonth()]);

注意(2019-03-08) - 我最初在 2009 年写的这个答案已经过时了。请参阅David Storey 的答案以获得更好的解决方案。

@zanona——日期对象不一定具有“所有这些内部定义”。ECMA-262 中所需要的只是一个时间值,它是一个数字。您看到的是Date.prototype.toString的结果,它取决于实现。
2021-03-14 12:30:51
多种语言 = 多维数组 ;) 翻译["monthName"][currentLanguage][d.getMonth()]
2021-03-19 12:30:51
@Devin 但是每次你想访问它时都会重新分配数组。
2021-03-24 12:30:51
有点令人沮丧的是,即使有new Date()返回Tue Sep 06 2011 20:02:25 GMT+0200 (CEST),这显然意味着 Date 对象已经在内部定义了所有这些(月份和星期几名称)它不是公开的,所以我们必须再次输入它。:(
2021-03-27 12:30:51
如果必须为支持的每种语言包含月份名称,这不是理想的解决方案。必须有更好的方法使用String#splitwithtoStringtoDateString
2021-03-31 12:30:51

现在可以使用 ECMAScript 国际化 API 来做到这一点:

const date = new Date(2009, 10, 10);  // 2009-11-10
const month = date.toLocaleString('default', { month: 'long' });
console.log(month);

'long'使用月份的全名、'short'简称,以及'narrow'更小的版本,例如字母语言中的第一个字母。

您可以将浏览器的区域设置更改为'default'您喜欢任何区域设置(例如'en-us'),它将使用该语言/国家/地区的正确名称。

使用toLocaleStringapi,您每次都必须传入语言环境和选项。如果您打算在多个不同日期使用相同的区域设置信息和格式选项,您可以使用Intl.DateTimeFormat

const formatter = new Intl.DateTimeFormat('fr', { month: 'short' });
const month1 = formatter.format(new Date());
const month2 = formatter.format(new Date(2003, 5, 12));
console.log(`${month1} and ${month2}`); // current month in French and "juin".

有关更多信息,请参阅我关于国际化 API 的博客文章

很好的解决方案,但对于我的用例,这最终太慢了。我正在处理数百个项目,平均每个项目大约 1ms 来获取月份和年份(chrome、safari)。我最终使用了接受的答案,但这只是因为它表现得更好。如果我只需要调用它几次,这将是我的首选方法。
2021-03-20 12:30:51
请注意 React Native,这适用于 iOS 设备,但在 Android 上,它显示不正确(只是吐出整个时间戳)。
2021-03-20 12:30:51
我可以确认 Safari Technology Preview 对此有支持。我认为应该是公认的答案
2021-03-25 12:30:51
现在大多数浏览器都支持:caniuse.com/#search=intl
2021-04-02 12:30:51
请注意,这不适用于任何版本的 IE(对于拥有企业客户端的每个人)。
2021-04-09 12:30:51

这是另一个,支持本地化:)

Date.prototype.getMonthName = function(lang) {
    lang = lang && (lang in Date.locale) ? lang : 'en';
    return Date.locale[lang].month_names[this.getMonth()];
};

Date.prototype.getMonthNameShort = function(lang) {
    lang = lang && (lang in Date.locale) ? lang : 'en';
    return Date.locale[lang].month_names_short[this.getMonth()];
};

Date.locale = {
    en: {
       month_names: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
       month_names_short: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    }
};

然后,您可以轻松添加对其他语言的支持:

Date.locale.fr = {month_names: [...]};
如果本地化名称数组是使用Date.prototype.toLocaleString构建的,这可能有意义此外,扩展内置原型和对象也不是一个好主意。
2021-03-16 12:30:51
请注意,这将在节点无法工作作为6.x的作为Date.localeundefined不过,对于其他 JS 实现来说,这是一个很好的答案!
2021-04-01 12:30:51

我衷心推荐format来自moment.js库的函数,您可以像这样使用它:

moment().format("MMM");  // "Apr" - current date
moment(new Date(2012, 01, 04)).format("MMM");  // "Feb" - from a local date
moment.utc(new Date(2012, 00, 04).format("MMM"); // "Jan" - from a UTC date

如果您需要月份的全名,请使用“MMMM”而不是“MMM”

除了一长串其他功能外,它还对国际化有很强的支持

Moment 是一个非常大的库,为此有点矫枉过正。现代的替代品包括Luxondate-fns,但话说回来,现在有广泛的浏览器支持国际化 API
2021-03-11 12:30:51
2021-03-23 12:30:51
如果您要走大量优化和减少 http 请求的路线,这可能不适合您。相反,如果您只想在一行代码中格式化月份名称,请坚持只使用月份名称数组。
2021-04-02 12:30:51
第一个将导致“Apr”。“MMM”显示月份的前三个字母,如果您想要全名,请改用“MMMM”。请参阅他们的文档以获取帮助。
2021-04-03 12:30:51

如果你不介意扩展 Date 原型(并且有一些很好的理由不想这样做),你实际上可以想出一个非常简单的方法:

Date.prototype.monthNames = [
    "January", "February", "March",
    "April", "May", "June",
    "July", "August", "September",
    "October", "November", "December"
];

Date.prototype.getMonthName = function() {
    return this.monthNames[this.getMonth()];
};
Date.prototype.getShortMonthName = function () {
    return this.getMonthName().substr(0, 3);
};

// usage:
var d = new Date();
alert(d.getMonthName());      // "October"
alert(d.getShortMonthName()); // "Oct"

然后这些函数将应用于所有javascript Date 对象。

@Kooilnc:这是因为你本质上是在全球范围内工作。如果您导入也执行此操作的其他人的函数或库,则它们可能会相互覆盖。
2021-03-25 12:30:51
“并且有一些很好的理由不想这样做”。只是好奇:你的意思是什么原因?
2021-04-05 12:30:51