在 JS 中将月份名称转换为月份编号的最简单方法?(一月 = 01)

IT技术 javascript date
2021-03-06 18:48:43

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

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

有什么建议吗?

6个回答

只是为了好玩,我这样做了:

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;
 }

Sry 所有的编辑 - 超越自己

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

其他方式;

alert( "JanFebMarAprMayJunJulAugSepOctNovDec".indexOf("Jun") / 3 + 1 );
这是一个巧妙的解决方案,但如果我在我拥有的代码中看到过,我可能会将其重写为可以理解的东西。
2021-04-17 18:48:43
很好的黑客,但我不会在生产中使用它。映射也将是简单且可扩展的,因此我们可以将“Jan”和“January”都映射为 1。
2021-04-24 18:48:43
您可以将这个想法扩展到完整的月份名称(3 个字符名称仍然有效),如下所示'January___February__March_____April_____May_______June______July______August____September_October___November__December__'.indexOf("Jun") / 10 + 1为什么是 10 个字符而不是 9 个?所以如果你想做相反的事情,你可以修剪.indexOf('_')
2021-05-08 18:48:43

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

var 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 所做的 - 因此创建一个函数来利用它是有道理的。
2021-04-20 18:48:43
这是迄今为止完成这项任务的最佳方式。创建一个生成日期对象的函数是缓慢且过于复杂的。
2021-04-21 18:48:43
有史以来最简单的。
2021-04-28 18:48:43
@AaronRomine JavaScript 中可用的许多本机方法比使用 JavaScript 重写它们的速度要快得多,通常我会使用它们。然而,这里 OP 没有表示想要一个简单的映射(碰巧涉及月份名称和数字)以外的任何东西,这是我所知道的最好的方法。
2021-05-02 18:48:43
经典的查找表,不错。
2021-05-10 18:48:43

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

month1 = month1.toLowerCase();
var months = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];
month1 = months.indexOf(month1);
这是最好的方法。
2021-05-05 18:48:43
谢谢,但您应该将 1 添加到“month1”以获得正确的月份值。函数 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); }
2021-05-12 18:48:43

如果您使用的是 moment.js:

moment().month("Jan").format("M");
谢谢你,它在 2020 年帮助了我!
2021-05-15 18:48:43