JavaScript日期计算结果不一致:2022年2月天数获取异常问题
问题原因
你的代码出现日期计算不一致是两个核心问题共同导致的:
- 基准日期不统一:生成下拉选项的
writemonths函数使用的是页面加载时刻的日期作为基准计算未来12个月,但是切换选项时调用的writemonth函数每次都会新建一个当前时刻的Date实例作为基准,两者的参照时间不一致,计算出来的月份自然会出现偏移。比如页面在1月加载,2月的时候再切换选项,writemonth的基准已经变成了2月,相同偏移量算出来的月份和之前生成选项时的对应关系完全错位,很容易偏移到闰年的2月,就会返回29天。 - 参数类型错误:
select元素的value默认是字符串类型,你没有做类型转换就直接传入writemonth参与月份加法运算,会触发隐式字符串拼接而非算术加法,导致传入Date构造函数的月份参数异常,进一步放大了日期计算的偏差。
修复方案
修改后的代码如下:
const monthNames = ["January","February","March","April","May","June","July","August","September","October","November","December"]; // 把基准日期存为全局变量,所有计算共用同一个基准 const baseDate = new Date(); function writemonth(x) { // 先把x转成整数再计算 const offset = parseInt(x, 10); const dateObj = new Date(baseDate.getFullYear(), baseDate.getMonth() + offset, 0); return dateObj.getDate(); } function writemonths() { var text = ""; for (let i = 1; i <= 12; i++) { var dateObj = new Date(baseDate.getFullYear(), baseDate.getMonth()+i, 0); var monthNumber = dateObj.getMonth(); var year = dateObj.getFullYear(); var tdays = dateObj.getDate(); var monthName = monthNames[monthNumber]; text += "<option value='"+i+"'>" + monthName + " " + year +" " + tdays +"</option>"; } return text; } document.getElementById("availability-calendar").innerHTML = "<select id='months' onchange='refresh();'><option value='0'>Loading...</option></select><div id='month'>"+writemonth(1)+"</div>"; document.getElementById("months").innerHTML = writemonths(); function refresh() { var e = document.getElementById("months").value; document.getElementById("month").innerHTML = writemonth(e); }
<div id="availability-calendar"></div>
内容的提问来源于stack exchange,提问作者José Gouveia
相关产品推荐
相关产品推荐

