【问题标题】:Easiest way to convert month name to month number in JS ? (Jan = 01)在 JS 中将月份名称转换为月份编号的最简单方法? (一月 = 01)
【发布时间】:2012-11-26 14:10:12
【问题描述】:

只想将 Jan 转换为 01(日期格式)

我可以使用array(),但正在寻找另一种方式...

有什么建议吗?

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    我这样做只是为了好玩:

    function getMonthFromString(mon){
       return new Date(Date.parse(mon +" 1, 2012")).getMonth()+1
    }
    

    奖励:它还支持完整的月份名称:-D 或者只是返回 -1 的新改进版本 - 如果需要,可以将其更改为抛出异常(而不是返回 -1):

    function getMonthFromString(mon){
    
       var d = Date.parse(mon + "1, 2012");
       if(!isNaN(d)){
          return new Date(d).getMonth() + 1;
       }
       return -1;
     }
    

    为所有的编辑道歉 - 超越自己

    【讨论】:

    • 好吧 - 请记住:我还没有测试过 - 这是即兴的。您可能想尝试/捕获并处理 NaN 条件(如果日期格式不正确)。我可能会更新。
    • @l2aelba 恭喜您选择了最慢的解决方案。 jsperf.com/month-number-speed-test
    • @epascarello 我同意这很慢 - 只是用他想要的回答 OP 的问题。效率并不是什么大不了的事:当我解析 300 多个字符串时,我会使用它吗?绝对不!但如果他所做的只是在每一页上运行几次,那么我认为这并不重要。
    • +1 这可能是最慢的,但它也是此页面上唯一不区分大小写、区域设置安全、意图明显并且在输入错误时具有不错的故障模式的答案。跨度>
    • 是的,所有其他答案都忽略大小写和本地。
    【解决方案2】:

    如果您使用的是 moment.js:

    moment().month("Jan").format("M");
    

    【讨论】:

    • 谢谢你,它在 2020 年帮助了我!
    【解决方案3】:

    对于 2021 年仍在寻找此答案的任何人,toLocaleDateString 现在已获得广泛支持

    let monthNumberFromString = (str) => {
      return new Date(`${str} 01 2000`).toLocaleDateString(`en`, {month:`2-digit`})
    }
    // monthNumberFromString(`jan`) returns 01
    

    【讨论】:

    • 这应该是现代浏览器公认的答案。
    【解决方案4】:

    另一种方式;

    alert( "JanFebMarAprMayJunJulAugSepOctNovDec".indexOf("Jun") / 3 + 1 );
    

    【讨论】:

    • 这是一个简洁的解决方案,但如果我曾经在我拥有的代码中看到过,我可能会将其重写为可以理解的部分。
    • 您可以将此想法扩展到完整的月份名称(3 个字符名称仍然可以使用),例如 'January___February__March_____April_____May_______June______July______August____September_October___November__December__'.indexOf("Jun") / 10 + 1为什么是 10 个字符而不是 9 个? 所以如果你想做相反的事情,你可以用 .indexOf('_') 修剪
    • 很好的 hack,但我不会在生产中使用它。映射也将简单且可扩展,因此我们可以将“Jan”和“January”都映射到 1。
    【解决方案5】:

    如果你不想要一个数组,那么对象呢​​?

    const months = {
      Jan: '01',
      Feb: '02',
      Mar: '03',
      Apr: '04',
      May: '05',
      Jun: '06',
      Jul: '07',
      Aug: '08',
      Sep: '09',
      Oct: '10',
      Nov: '11',
      Dec: '12',
    }
    

    【讨论】:

    • 这是迄今为止完成这项任务的最佳方式。创建一个生成日期对象的函数是缓慢且过于复杂的。
    • 我同意使用对象(或数组)更有效 - 但 OP 要求使用非数组。我知道如果我可以使用内置功能,我有时会在处理时间上受到影响。将字符串解析为日期是 JS 所做的事情 - 因此创建一个函数来利用它是有意义的。
    • @AaronRomine JavaScript 中可用的许多本机方法比使用 JavaScript 重写它们要快得多,通常我会使用它们。但是,这里 OP 没有表明除了简单的映射(恰好涉及月份名称和数字)之外需要任何其他东西,这是我所知道的最好的方式。
    • 有史以来最简单的。
    • 经典查找表,不错。
    【解决方案6】:

    另一种方法来做同样的事情

    month1 = month1.toLowerCase();
    var months = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];
    month1 = months.indexOf(month1);
    

    【讨论】:

    • 谢谢,但您应该将 1 添加到“month1”以获得正确的月份值。 function getMonthFromString(mon){ let month1 = mon.toLowerCase();让月份 = [“janvier”、“février”、“mars”、“avril”、“mai”、“juin”、“juillet”、“août”、“septembre”、“octobre”、“novembre”、“décembre” "];返回 (months.indexOf(month1)+1); }
    • 这是最好的方法。
    【解决方案7】:

    function getNumericMonth(monthAbbr) {
          return (String(['January',
            'February',
            'March',
            'April',
            'May',
            'June',
            'July',
            'August',
            'September',
            'October',
            'November',
            'December'].indexOf(monthAbbr) + 1).padStart(2, '0'))
        }
        
       console.log(getNumericMonth('September'));

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案8】:

    我通常用来做一个函数:

    function getMonth(monthStr){
        return new Date(monthStr+'-1-01').getMonth()+1
    }
    

    然后这样称呼它:

    getMonth('Jan');
    getMonth('Feb');
    getMonth('Dec');
    

    【讨论】:

      【解决方案9】:
      function getMonthDays(MonthYear) {
        var months = [
          'January',
          'February',
          'March',
          'April',
          'May',
          'June',
          'July',
          'August',
          'September',
          'October',
          'November',
          'December'
        ];
      
        var Value=MonthYear.split(" ");      
        var month = (months.indexOf(Value[0]) + 1);      
        return new Date(Value[1], month, 0).getDate();
      }
      
      console.log(getMonthDays("March 2011"));
      

      【讨论】:

        【解决方案10】:

        这是所选答案的修改版本:

        getMonth("Feb")
        function getMonth(month) {
          d = new Date().toString().split(" ")
          d[1] = month
          d = new Date(d.join(' ')).getMonth()+1
          if(!isNaN(d)) {
            return d
          }
          return -1;
        }
        

        【讨论】:

          【解决方案11】:
          var monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
          

          然后只需调用monthNames[1] 那将是二月

          所以你总是可以做出类似的东西

            monthNumber = "5";
            jQuery('#element').text(monthNames[monthNumber])
          

          【讨论】:

          • 添加 parseInt() 以便我们可以使用“05”
          • 这似乎与 OP 想要的相反。 “五月 => 05”而不是“05 => 五月”
          【解决方案12】:

          这是另一种方式:

          var currentMonth = 1
          var months = ["ENE", "FEB", "MAR", "APR", "MAY", "JUN", 
                        "JUL", "AGO", "SEP", "OCT", "NOV", "DIC"];
          
          console.log(months[currentMonth - 1]);
          

          【讨论】:

          • 这篇文章在他们选择的语言中完全有意义。
          【解决方案13】:

          这是一个简单的单行函数

          //ECHMA5
          function GetMonth(anyDate) { 
             return 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(',')[anyDate.getMonth()];
           }
          //
          // ECMA6
          var GetMonth = (anyDate) => 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(',')[anyDate.getMonth()];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-13
            • 2021-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-26
            • 2020-07-25
            相关资源
            最近更新 更多