使用 JavaScript 确定一个月中的天数的最佳方法是什么?

新手上路,请多包涵

我一直在使用此功能,但我想知道获得它的最有效和最准确的方法是什么。

 function daysInMonth(iMonth, iYear) {
   return 32 - new Date(iYear, iMonth, 32).getDate();
}

原文由 Chatu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 300
2 个回答
 function daysInMonth (month, year) { // Use 1 for January, 2 for February, etc.
  return new Date(year, month, 0).getDate();
}

console.log(daysInMonth(2, 1999)); // February in a non-leap year.
console.log(daysInMonth(2, 2000)); // February in a leap year.

第 0 天是上个月的最后一天。因为月份构造函数是基于 0 的,所以效果很好。有点 hack,但这基本上就是你减去 32 所做的事情。

查看更多: 当月天数

原文由 FlySwat 发布,翻译遵循 CC BY-SA 4.0 许可协议

一些答案(也在其他问题上)有闰年问题或使用了日期对象。尽管 javascript 的 Date object 涵盖了 1970 年 1 月 1 日左右的大约 285616 年(100,000,000 天),但我受够了不同浏览器之间各种意外的日期 不一致(最明显的是 0 到 99 年)。我也很好奇如何计算它。

所以我写了一个简单的 算法来计算 正确 的( Proleptic Gregorian / Astronomical / ISO 8601:2004(条款 4.3.2.1),所以 年份 0 存在并且是闰年和 负年支持) 给定月份和年份的天数。

它使用 短路位掩码-模leapYear算法(针对js稍作修改)和常见的mod-8月算法。

请注意,在 AD/BC 表示法中,AD/BC 0 年不存在:而是年份 1 BC 是闰年!

如果您需要考虑 BC 符号,那么只需先减去(否则为正)年份值的一年!! (或从 1 中减去年份以进行进一步的年份计算。)

 function daysInMonth(m, y){
  return m===2?y&3||!(y%25)&&y&15?28:29:30+(m+(m>>3)&1);
}
 <!-- example for the snippet -->
<input type="text" value="enter year" onblur="
  for( var r='', i=0, y=+this.value
     ; 12>i++
     ; r+= 'Month: ' + i + ' has ' + daysInMonth(i, y) + ' days<br>'
     );
  this.nextSibling.innerHTML=r;
" /><div></div>

注意,月份必须从 1 开始!

请注意,这是一个不同的算法,然后我在我的 Javascript 中使用的幻数查找计算一年中的第几天 (1 - 366) 答案,因为这里只有二月才需要闰年的额外分支。

原文由 GitaarLAB 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题