You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:39:04