ChatGPT解决这个技术问题 Extra ChatGPT

从日期获取月份名称

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

var objDate = new Date("10/11/2009");
如果可以接受 stackoverflow.com/a/18648314/5846045 来指导未来的读者更好地回答,那就太好了

J
Jesper

较短的版本:

const monthNames = [“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月” " ];常量 d = 新日期(); document.write("当前月份是" + monthNames[d.getMonth()]);

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


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

现在可以使用 ECMAScript 国际化 API 执行此操作:

const date = new Date(2009, 10, 10); // 2009-11-10 const month = date.toLocaleString('default', { month: 'long' });控制台日志(月);

'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} 和 ${month2}`); // 法语和“juin”的当前月份。

有关详细信息,请参阅我在 Internationalization API 上的博文。


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

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

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: [...]};

请注意,从 6.x 开始,这不适用于节点,因为 Date.localeundefined。不过,对于其他 JS 实现来说,这是一个很好的答案!
如果本地化名称数组是使用 Date.prototype.toLocaleString 构建的,这可能是有意义的。此外,扩展内置原型和对象也不是一个好主意。
N
Nivin V Joseph

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

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”

除了一长串其他功能之外,它还具有强大的 support for internationalization


第一个将导致“Apr”。 “MMM”显示月份的前三个字母,如果您想要全名,请改用“MMMM”。请参阅他们的 documentation 寻求帮助。
如果您要进行大量优化并减少 http 请求,那么这可能不是您的选择。相反,如果您只想在一行代码中格式化月份名称,请坚持使用月份名称数组。
Moment 是一个 very 的大型库,为此有点矫枉过正。现代替代品包括 Luxondate-fns,但又是 wide browser support for the Internationalization API nowadays
moment.js 已弃用,请参阅 github.com/you-dont-need/You-Dont-Need-Momentjs
n
nickf

如果您不介意扩展 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:这是因为您本质上是在全球范围内工作。如果您导入其他人的函数或库也执行此操作,那么它们可能会相互覆盖。
K
KARTHIKEYAN.A

如果我们需要传递我们的输入,那么我们需要使用以下方式

输入:'2020-12-28'

代码:

new Date('2020-12-28').toLocaleString('en-us',{month:'short', year:'numeric'})

输出:“2020 年 12 月”


太好了,这非常适合我的情况。谢谢!
我们可以使用用户本地代码代替 'en-us' 吗?
A
Andres Paul

您可以简单地使用 Date.toLocaleDateString() 并将所需的日期解析为参数

常量事件 = 新日期(日期.UTC(2012, 11, 20, 3, 0, 0));常量选项 = { 年:“数字”,月:“短”,日:“数字”}; console.log(event.toLocaleDateString('de-DE', options)); // 预期输出:Donnerstag,2012 年 12 月 20 日 console.log(event.toLocaleDateString('en-US', options)); // 美国格式 // 如果你只想要月份 console.log(event.toLocaleDateString(undefined, { month: 'short'})); console.log(event.toLocaleDateString(undefined, { month: 'long'}));

您可以在 Firefox documentation 中找到更多信息


M
Mitanshu

如果你赶时间......那么你去!

const date = new Date(Date.now());
date.toLocaleString('en-US', {month: 'short'}); // {month:'long'}

预期输出:"Apr"


J
Joseph Christopher
Date.prototype.getMonthName = function() {
    var monthNames = [ "January", "February", "March", "April", "May", "June", 
                       "July", "August", "September", "October", "November", "December" ];
    return monthNames[this.getMonth()];
}

它可以用作

var month_Name = new Date().getMonthName();

A
AzizStark

document.write(new Date().toLocaleString('en-us',{month:'long', year:'numeric', day:'numeric'}))


您也可以添加时间:new Date().toLocaleString('he-il',{month:'long', year:'numeric', day:'numeric', hour: 'numeric', minute:'numeric', second: 'numeric'});
S
S M Sajjad Salam

日期对象的一些常见的简单过程可以通过这个来完成。

var monthNames = [“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月” " ]; var monthShortNames = [“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月” " ];函数 dateFormat1(d) { var t = new Date(d);返回 t.getDate() + ' ' + monthNames[t.getMonth()] + ', ' + t.getFullYear(); } 函数 dateFormat2(d) { var t = new Date(d);返回 t.getDate() + ' ' + monthShortNames[t.getMonth()] + ', ' + t.getFullYear(); } console.log(dateFormat1(new Date())) console.log(dateFormat2(new Date()))

或者您可以制作日期原型,例如

Date.prototype.getMonthName = function() { var monthNames = [“一月”,“二月”,“三月”,“四月”,“五月”,“六月”,“七月”,“八月”,“九月”, “十月”、“十一月”、“十二月”];返回月份名称[this.getMonth()]; } Date.prototype.getFormatDate = function() { var monthNames = [“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月” 、“十月”、“十一月”、“十二月”];返回 this.getDate() + ' ' + monthNames[this.getMonth()] + ', ' + this.getFullYear(); } console.log(new Date().getMonthName()) console.log(new Date().getFormatDate())

前任:

var dateFormat3 = new Date().getMonthName(); # March

var dateFormat4 = new Date().getFormatDate(); # 16 March, 2017


谢谢!我还不了解原型,但我期待着尝试一下。
T
Tim Büthe

您可以使用 datejs 来执行此操作。检查 FormatSpecifiers,MMMM 为您提供月份名称:

var objDate = new Date("10/11/2009");
document.write(objDate.toString("MMMM"));

datejs 将其本地化为 150 多个语言环境! See here


r
rgmt

尝试:

var objDate = new Date("10/11/2009");

var strDate =
    objDate.toLocaleString("en", { day: "numeric" }) + ' ' +
    objDate.toLocaleString("en", { month: "long"  }) + ' ' +
    objDate.toLocaleString("en", { year: "numeric"});

这在 2017 年冬季有效! 3 年前左右其他用户建议使用“en-us”在 Chrome 中不起作用。
v
venkat7668

另一种格式化日期的方法

new Date().toLocaleString('en-us',{month:'long', year:'numeric', day:'numeric'}) //output: "May 21, 2019"

Д
Дамян Станчев

这是一种不依赖硬编码数组并支持多个语言环境的方法。

如果你需要一个完整的数组:

var monthsLocalizedArray = function(locale) {
    var result = [];
    for(var i = 0; i < 12; i++) {
        result.push(new Date(2010,i).toLocaleString(locale,{month:"long"}));
    }
    return result;
};

用法:

console.log(monthsLocalizedArray('en')); // -> ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
console.log(monthsLocalizedArray('bg')); // -> ["януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември"]

如果您只需要选定的月份(更快):

var monthLocalizedString = function(month, locale) {
    return new Date(2010,month).toLocaleString(locale,{month:"long"});
};

用法:

console.log(monthLocalizedString(1, 'en')); // -> February
console.log(monthLocalizedString(1, 'bg')); // -> февруари
console.log(monthLocalizedString(1, 'de')); // -> Februar

在 Chrome 和 IE 11 上经过测试并且工作正常。在 mozilla 上需要进行一些修改,因为它会返回整个日期。


即使在 safary 中,这也行不通。因为toLocaleString
D
Denis Bubnov

除了声明包含所有月份名称的数组然后用索引指向之外,我们还可以将它写成更短的版本,如下所示:

var objDate = new Date().toLocaleString("en-us", { month: "long" }); // result: August
var objDate = new Date().toLocaleString("en-us", { month: "short" }); // result: Aug

请注意,这在浏览器中不能可靠地工作...... Safari(移动和桌面)将输出类似的内容:MAY 1, 2015 AT 12:00:00 AM GMT-4(使用 { month: "long" } 参数时)
您还可以使用 new Date().toLocaleString(navigator.language, { month: "short" }) 获取默认值
Y
Yacoby

不幸的是,提取月份名称的最佳方法是使用 UTCString 表示:

Date.prototype.monthName = function() {
    return this.toUTCString().split(' ')[2]
};

d = new Date();
//=> Thu Mar 06 2014 23:05:21 GMT+0000 (GMT)

d.monthName();
//=> 'Mar'

B
Bayram

最简单最简单的方法:

const dateStr = new Date(2020, 03, 10).toDateString(); // 'Fri Apr 10 2020' const dateStrArr = dateStr.split(' '); // ['Fri', 'Apr', '10', '2020'] console.log(dateStrArr[1]); // '四月'

将日期转换为字符串。用 ' ' 空格分割。从数组中选择第二个元素。


我非常喜欢这个答案。直截了当。
D
Dinesh

您可以使用几种可用的日期格式化程序之一。由于这属于 JavaScript 规范,因此它可以在浏览器和服务器端模式下使用。

objDate.toString().split(" ")[1]; // gives short name, unsure about locale 
objDate.toLocaleDateString.split(" ")[0]; // gives long name

例如

js> objDate = new Date(new Date() - 9876543210)
Mon Feb 04 2013 12:37:09 GMT-0800 (PST)
js> objDate.toString().split(" ")[1]
Feb
js> objDate.toLocaleString().split(" ")[0]
February

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date 上还有更多


s
shacharsol

现在的自然格式是使用 Moment.js。

以字符串格式获取月份的方法在 Moment.js 中非常简单,无需在代码中硬编码月份名称:以月份名称格式和全年(2015 年 5 月)获取当前月份和年份:

  moment(new Date).format("MMMM YYYY");

已经为其他目的安装了时刻,这是最简单的解决方案。
Moment 是一个 very 的大型库,为此有点矫枉过正。现代替代品包括 Luxondate-fns,但又是 wide browser support for the Internationalization API nowadays
P
Penny Liu

在 IE 11、Chrome、Firefox 上测试

常量 dt = 新日期(); const locale = navigator.languages != undefined ? navigator.languages[0] : navigator.language; const fullMonth = dt.toLocaleDateString(locale, {month: 'long'}); console.log(fullMonth);


O
OXiGEN

你可以试试这个:

让 d = new Date(), t = d.toDateString().split(" ");控制台.log(t[2] + " " + t[1] + " " + t[3]);


C
Community

如果您使用剑道,也可以这样做。

kendo.toString(dateobject, "MMMM");

以下是来自 kendo site 的格式化程序列表:

"d" 呈现月份中的第几天,从 1 到 31。 "dd" 月份中的第几天,从 01 到 31。 "ddd" 星期几的缩写名称。 "dddd" 星期几的全名。 "f" 日期和时间值的十分之一秒。 "ff" 日期和时间值的百分之一秒。 "fff" 日期和时间值中的毫秒数。 "M" 月份,从 1 到 12。 "MM" 月份,从 01 到 12。 "MMM" 月份的缩写名称。 “MMMM”月份的全称。 "h" 小时,使用 12 小时制,从 1 到 12。 "hh" 小时,使用 12 小时制,从 01 到 12。 "H" 小时,使用 24 小时制,从 1 到 23 . "HH" 小时,使用 24 小时制,从 01 到 23。 "m" 分钟,从 0 到 59。 "mm" 分钟,从 00 到 59。 "s" 秒,从 0 到 59 . "ss" 第二个,从 00 到 59。 "tt" AM/PM 指示符。 "yy" 年份值的最后两个字符。 "yyyy" 年份全值。 "zzz" 使用格式解析 UTC 日期字符串时的本地时区。


M
Matt K

如果您不想使用外部库,或存储月份名称数组,或者 ECMAScript 国际化 API 由于浏览器兼容性而不够好,您始终可以通过从日期输出:

var now = new Date();
var monthAbbrvName = now.toDateString().substring(4, 7);

这将为您提供缩写的月份名称,例如 Oct。我相信日期会以各种格式出现,具体取决于初始化和您的语言环境,因此请查看 toDateString() 返回的内容并根据此重新计算您的 substring() 值.


P
Prasanna Jathan

您可以处理或不翻译成当地语言

生成值为“2009 年 10 月 11 日”

const objDate = new Date("10/11/2009"); const 月 = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec '] if (objDate !== '无效日期' && !isNaN(objDate)) { console.log(objDate.getDate() + ' ' + 月[objDate.getMonth()] + ' ' + objDate.getFullYear() ) }

用于将月份翻译成本地语言的 ECMAScript 国际化 API(例如:11 octobre)

const convertDate = new Date('10/11/2009') const lang = 'fr' // de, es, ch if (convertDate !== 'Invalid Date' && !isNaN(convertDate)) { console.log(convertDate .getDate() + ' ' + convertDate.toLocaleString(lang, { month: 'long' })) }


T
Tron

也可以这样做:

var x = new Date().toString().split(' ')[1];    // "Jul"

不应使用此解决方案。有一种特定的方法可以获取其他答案指出的字符串中的月份,无需直接从日期中提取它。使用这种方法,您不能轻松地在语言之间切换。
m
mhu

如果您使用 jQuery,那么您可能也在使用 jQuery UI,这意味着您可以使用 $.datepicker.formatDate()

$.datepicker.setDefaults( $.datepicker.regional[ "nl" ] );   // dutch
$.datepicker.formatDate( "dd MM yy", objDate );

u
user3920942

我的最佳解决方案如下:

       var dateValue = Date();
       var month = dateValue.substring(4,7);
       var date = dateValue.substring(8,10);
       var year = dateValue.substring(20,24);
       var finaldateString = date+"-"+month+"-"+year;

对我来说似乎很脆弱......它并没有真正回答OP的问题
是什么让这成为您的“最佳解决方案”?
l
lnmunhoz

对于 momentjs,只需使用 format 表示法。

const myDate = new Date()
const shortMonthName = moment(myDate).format('MMM') // Aug
const fullMonthName = moment(myDate).format('MMMM') // August

除了这个答案已经给出了 2 次之外,moment 是一个 very 大型库,并且为此太过分了。现代的替代品包括 Luxondate-fns,但又是 wide browser support for the Internationalization API nowadays
K
Kratak

对我来说,这是最好的解决方案,

也适用于 TypeScript

const env = process.env.REACT_APP_LOCALE || 'en';

const namedMonthsArray = (index?: number): string[] | string => {
  const months = [];

  for (let month = 0; month <= 11; month++) {
    months.push(
      new Date(new Date('1970-01-01').setMonth(month))
        .toLocaleString(env, {
          month: 'long',
        })
        .toString(),
    );
  }
  if (index) {
    return months[index];
  }
  return months;
};

输出是

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