我一直在使用此功能,但我想知道获得它的最有效和最准确的方法是什么。
function daysInMonth(iMonth, iYear) {
return 32 - new Date(iYear, iMonth, 32).getDate();
}
原文由 Chatu 发布,翻译遵循 CC BY-SA 4.0 许可协议
我一直在使用此功能,但我想知道获得它的最有效和最准确的方法是什么。
function daysInMonth(iMonth, iYear) {
return 32 - new Date(iYear, iMonth, 32).getDate();
}
原文由 Chatu 发布,翻译遵循 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 许可协议
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
第 0 天是上个月的最后一天。因为月份构造函数是基于 0 的,所以效果很好。有点 hack,但这基本上就是你减去 32 所做的事情。
查看更多: 当月天数