使用 JavaScript 确定一个月天数的最佳方法是什么?
2022-08-30 04:49:18
我一直在使用这个函数,但我想知道什么是最有效和最准确的方法来获取它。
function daysInMonth(iMonth, iYear) {
return 32 - new Date(iYear, iMonth, 32).getDate();
}
我一直在使用这个函数,但我想知道什么是最有效和最准确的方法来获取它。
function daysInMonth(iMonth, iYear) {
return 32 - new Date(iYear, iMonth, 32).getDate();
}
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 开始的,因此效果很好。有点黑客,但这基本上就是你通过减去32所做的。
查看更多 : 当月的天数
一些答案(也包括其他问题)存在闰年问题或使用 Date 对象。虽然javascript在1970年1月1日两侧覆盖了大约285616年(100,000,000天),但我厌倦了不同浏览器之间各种意想不到的日期不一致(最明显的是0到99年)。我也很好奇如何计算它。Date object
因此,我写了一个简单的,最重要的是,小算法来计算给定月份和年份的正确(Proleptic Gregorian / Astronomical / ISO 8601:2004(条款4.3.2.1),因此年份0
存在并且是闰年,支持负年)日数。
它使用短路位掩码模闰年算法(对js稍作修改)和常见的mod-8月算法。
请注意,在表示法中,公元0年/公元前不存在:相反,年份是闰年!
如果您需要考虑BC表示法,那么只需先减去一年的(否则为正数)年份值!(或者从中减去年份以进行进一步的年份计算。AD/BC
1 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)答案,因为在这里,闰年的额外分支只需要二月。