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

JavaScript日历函数问题:日期显示从0开始而非正确的1-31

问题解决:日历日期显示从0开始而非1的修复

问题根源

你在weekdays.forEach循环里,使用数组索引index作为日期文本内容,但数组索引是从0开始的,所以会显示0到30(对应12月的31天),而实际需要的是1到31的真实日期。

修复方案

有两种简单的修复方式,推荐第二种让逻辑更清晰:

方式1:直接修正文本内容

在所有createTextNode的地方,把index改为index + 1,索引加1后正好对应1到31的日期:

// 以case 0为例,所有case都需要修改
var Textnode = document.createTextNode(index + 1);

方式2:优化数据存储(更推荐)

修改getMonthInfo函数,让数组存储包含真实日期和对应星期的对象,避免索引混淆,同时简化冗余代码:

function getMonthInfo(year, month) {
    let daysInfo = [];
    let numDays = new Date(year, month, 0).getDate();

    for (let day = 1; day <= numDays; day++) {
        let weekday = new Date(year, month - 1, day).getDay();
        daysInfo.push({ day, weekday }); // 存储真实日期和对应的星期
    }

    daysInfo.forEach(function (item) {
        console.log(item.weekday, item.day);

        var number = document.createElement("p");
        var Textnode = document.createTextNode(item.day); // 直接使用真实日期
        number.appendChild(Textnode);
        // 用模板字符串拼接ID,省去重复的switch判断
        document.getElementById(`CM${item.weekday}`).appendChild(number);
    });
}

额外优化建议

每次调用getMonthInfo前,建议清空日期容器内的旧内容,避免重复渲染:

// 在循环前添加这段代码
for (let i = 0; i < 7; i++) {
    const container = document.getElementById(`CM${i}`);
    // 保留星期标题,删除后续的日期节点
    while (container.children.length > 1) {
        container.removeChild(container.lastChild);
    }
}

内容的提问来源于stack exchange,提问作者Braydan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:55:17