JavaScript中for循环用日期值返回空数组,求问题排查与解决
问题排查与解决方案
咱们直接说问题根源:JavaScript的Date构造函数解析字符串时,默认遵循**MM/DD/YYYY(月/日/年)**的格式,和你预期的DD/MM/YYYY(日/月/年)完全相反!
拆解下你的代码就能看明白:
new Date('10/12/2019')被解析成了2019年10月12日,所以getDate()返回10,startDate的值是10,这部分没问题。- 但
new Date('22/12/2019')就踩坑了:JS里月份的合法范围是0-11(对应1-12月),22明显超出了月份的有效范围,这个Date对象会变成无效日期,调用getDate()会返回NaN,endDate也就成了NaN。
再看你的循环条件:i <= endDate等价于10 <= NaN,在JS里任何和NaN的比较结果都是false,所以循环根本没执行,自然输出空数组。
修正方案
有两种彻底避免格式歧义的方法:
方案1:使用ISO 8601标准格式(YYYY-MM-DD)
这种格式是JSDate能稳定解析的无歧义格式:
// 期望获取2019年12月10日的日期天数 const startDate = new Date('2019-12-10').getDate(); // 期望获取2019年12月22日的日期天数 const endDate = new Date('2019-12-22').getDate(); // 创建空数组用于后续存入数据 let freedays = []; // for循环初始值为startDate对应的天数'10',循环条件为i小于等于endDate对应的天数'22'时停止 for (let i = startDate; i <= endDate; i++) { freedays.push(i) } console.log(freedays) // 输出: [10, 11, 12, ..., 22]
方案2:直接传入年、月、日参数(注意月份是0起始)
Date构造函数支持直接传入年、月、日参数,其中月份是从0开始计数的(12月对应11),这样完全不会有格式混淆:
// 2019年12月10日:月份传11(0=1月,11=12月) const startDate = new Date(2019, 11, 10).getDate(); // 2019年12月22日 const endDate = new Date(2019, 11, 22).getDate(); let freedays = []; for (let i = startDate; i <= endDate; i++) { freedays.push(i) } console.log(freedays) // 输出: [10, 11, 12, ..., 22]
修改后循环就能正常执行,得到你想要的日期天数数组啦。
内容的提问来源于stack exchange,提问作者Ricardo de Vries
相关产品推荐
相关产品推荐

