【问题标题】:Get month name from Date从日期获取月份名称
【发布时间】:2010-12-11 05:29:00
【问题描述】:

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

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

【问题讨论】:

标签: javascript date date-format time-format


【解决方案1】:

短版:

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'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 但每次你想访问它时都会重新分配数组。
【解决方案2】:

现在可以使用 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".

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

【讨论】:

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

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

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.localeundefined,从 6.x 开始。不过,对于其他 JS 实现来说,这是一个很好的答案!
  • 如果本地化名称数组是使用 Date.prototype.toLocaleString 构建的,这可能是有意义的。此外,扩展内置原型和对象也不是一个好主意。
【解决方案4】:

我衷心推荐format 库中的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

【讨论】:

【解决方案5】:

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

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

const event = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

const options = {  year: 'numeric', month: 'short', day: 'numeric' };

console.log(event.toLocaleDateString('de-DE', options));
// expected output: Donnerstag, 20. Dezember 2012

console.log(event.toLocaleDateString('en-US', options));
// US format 


// In case you only want the month
console.log(event.toLocaleDateString(undefined, { month: 'short'}));
console.log(event.toLocaleDateString(undefined, { month: 'long'}));

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

【讨论】:

    【解决方案7】:

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

    输入: '2020-12-28'

    代码:

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

    输出:“2020 年 12 月”

    【讨论】:

      【解决方案8】:
      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();
      

      【讨论】:

        【解决方案9】:

        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'});
        【解决方案10】:

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

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

        预期输出:"Apr"

        【讨论】:

          【解决方案11】:

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

          var monthNames = ["January", "February", "March", "April", "May", "June",
            "July", "August", "September", "October", "November", "December"
          ];
          var monthShortNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
            "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
          ];
          
          function dateFormat1(d) {
            var t = new Date(d);
            return t.getDate() + ' ' + monthNames[t.getMonth()] + ', ' + t.getFullYear();
          }
          
          function dateFormat2(d) {
            var t = new Date(d);
            return t.getDate() + ' ' + monthShortNames[t.getMonth()] + ', ' + t.getFullYear();
          }
          
          console.log(dateFormat1(new Date()))
          console.log(dateFormat2(new Date()))

          或者你可以像这样制作日期原型

          Date.prototype.getMonthName = function() {
            var monthNames = ["January", "February", "March", "April", "May", "June",
              "July", "August", "September", "October", "November", "December"
            ];
            return monthNames[this.getMonth()];
          }
          
          
          Date.prototype.getFormatDate = function() {
            var monthNames = ["January", "February", "March", "April", "May", "June",
              "July", "August", "September", "October", "November", "December"
            ];
            return 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

          【讨论】:

          • 谢谢!我还不了解原型,但我期待着尝试一下。
          【解决方案12】:

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

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

          并且 datejs 已针对 150 多个语言环境进行了本地化! See here

          【讨论】:

            【解决方案13】:

            试试:

            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 中不起作用。
            【解决方案14】:

            另一种格式化日期的方法

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

            【讨论】:

              【解决方案15】:

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

              如果您需要整个数组:

              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
              【解决方案16】:

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

              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" })获取默认值
              【解决方案17】:

              不幸的是,提取月份名称的最佳方法是从 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'
              

              【讨论】:

                【解决方案18】:

                您可以使用几种可用的日期格式化程序之一。由于这属于 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 有更多内容

                【讨论】:

                  【解决方案19】:

                  如今的自然格式是使用 Moment.js。

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

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

                  【讨论】:

                  【解决方案20】:

                  在 IE 11、Chrome、Firefox 上测试

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

                  【讨论】:

                    【解决方案21】:

                    你可以试试这个:

                    let d = new Date(),
                      t = d.toDateString().split(" ");
                    
                    console.log(t[2] + " " + t[1] + " " + t[3]);

                    【讨论】:

                      【解决方案22】:

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

                      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" 小时,使用从 1 到 12 的 12 小时制。

                      "hh" 小时,使用从 01 到 12 的 12 小时制。

                      “H”小时,使用从 1 到 23 的 24 小时制。

                      "HH" 小时,使用从 01 到 23 的 24 小时制。

                      "m" 分钟,从 0 到 59。

                      "mm" 分钟,从 00 到 59。

                      "s" 第二个,从 0 到 59。

                      "ss" 第二个,从 00 到 59。

                      “tt”AM/PM 指示符。

                      "yy" 年份值的最后两个字符。

                      "yyyy" 年份全值。

                      "zzz" 使用格式解析 UTC 日期字符串时的本地时区。

                      【讨论】:

                        【解决方案23】:

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

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

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

                        【讨论】:

                          【解决方案24】:

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

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

                          const objDate = new Date("10/11/2009");
                          const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
                          if (objDate !== 'Invalid Date' && !isNaN(objDate)) {
                            console.log(objDate.getDate() + ' ' + months[objDate.getMonth()] + ' ' + objDate.getFullYear())
                          }
                          1. ECMAScript 国际化 API 将月份翻译成当地语言(例如:10 月 11 日)

                          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'
                            }))
                          }

                          【讨论】:

                            【解决方案25】:

                            最简单最简单的方法。

                            1. 将日期转换为字符串。
                            2. 用“ ”空格分割。
                            3. 从数组中选择第二个元素。

                               
                            var now = new Date();
                            var nowStr = now.toDateString(); 
                            // "Fri Apr 2020'
                            
                            var currentMonth = nowStr.split(' '); 
                            // ['Fri' 'Apr' '2020']
                            
                            console.log(currentMonth[1]);
                            // 'Apr'
                                     

                            【讨论】:

                            • 我非常喜欢这个答案。直截了当。
                            【解决方案26】:

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

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

                            【讨论】:

                              【解决方案27】:

                              我的最佳解决方案如下:

                                     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 的问题
                              • 是什么让它成为您的“最佳解决方案”?
                              【解决方案28】:

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

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

                              【讨论】:

                              【解决方案29】:

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

                              对于 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"]
                              

                              【讨论】:

                                【解决方案30】:

                                也可以这样做:

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

                                【讨论】:

                                • 不应使用此解决方案。有一种特定的方法可以获取其他答案指出的字符串中的月份,无需直接从日期中提取它。使用这种方法,您无法轻松地在语言之间切换。
                                猜你喜欢
                                • 2020-06-17
                                • 2011-05-28
                                • 2021-08-21
                                • 1970-01-01
                                • 2017-05-26
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多