JavaScript 中 Date 细节问题导致的程序 Bug

本文介绍了一个关于日历控件在显示31号时出现的问题及其解决方案。通过调试发现,问题出现在获取某月天数的函数中,当setMonth设置的月份天数不足31天时,自动进位到了下个月导致日期错误。文章详细解释了问题的原因,并给出了修复方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者: Angus.Fenying

日期: 2016-09-05 11:20 AM

今天遇到一个 Bug,是在逢 31 号当天,日历控件(同事开发的)就会出问题。 表现为凡是有 31 号的月份几乎都不显示 31 号,但是部分月份如 12 月和 7 月除外。

检查代码发现出错的位置在于

//返回某月天数
function getDaysBayYearAndMonth(year, month) {

    var date = new Date();
    date.setFullYear(year);
    date.setMonth(month);
    date.setDate(0);
    return date.getDate();
}

把系统时间设置为 8 月 31 号,重启浏览器,因为是当天发现的。 从这个函数体开始单步调试,依次检查,发现结果如下:

/**
 * 调用函数 getDaysBayYearAndMonth(2016, 8)
 */
function getDaysBayYearAndMonth(year, month) {

    var date = new Date(); // 2016-08-31
    date.setFullYear(year); // 2016-08-31
    date.setMonth(month);  // 2016-10-01
    date.setDate(0); // 2016-09-30
    return date.getDate(); // 30
}

找到问题的关键所在了,因为 setMonth 修改了月份为 9 月,而 9 月没有 31 号,遂自动进位到 10 月 1 日。 然后再设置 setDate(0) 使得返回上个月最后一天,变成了 9 月 30 日。

那 12 月和 7 月为什么没有问题呢?因为 7 月的下一个月是 8 月,而 12 月的下一个月是 1 月,1 月和 8 月都是有 31 号的。

问题遂解。

转载于:https://my.oschina.net/fenying/blog/744116

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值