为什么拼接API路径的path变量时月份前导零会丢失?
问题解答
代码错误原因
- switch 语法逻辑错误
switch 语句的执行规则是将switch()括号内的表达式结果,和每个case后的值做全等匹配。你代码里switch(month)传入的是数字类型的月份值,而case (month < 10)的结果是布尔类型的true/false,二者类型不匹配永远不会命中这个case,所以代码始终执行default分支,不会执行补前导零的逻辑。 - 月份取值错误
JS 内置的Date.getMonth()方法返回值范围是0~11,0对应1月,11对应12月,你没有对返回值做+1修正,直接作为月份使用,会导致实际月份比预期小1,这也是输出结果里出现2021701的直接原因之一。 - 字符串拼接冗余错误
就算补零的case被命中,你已经将month赋值为带前导零的字符串0${month},后续拼接路径时又额外加了一个0,会导致月份最终变成00x的错误格式。
修复代码
推荐使用padStart方法直接对月份做补零处理,不需要写复杂的switch分支,代码更简洁可靠:
const date = new Date(); const year = date.getFullYear(); // 先修正月份为1~12的范围,再转字符串补前导零到2位 const month = String(date.getMonth() + 1).padStart(2, '0'); const path = `/v2/reports/time/team?from=${year}${month}01&to=${year}${month}31`;
如果需要兼容不支持padStart的旧环境,可以用简单的三元判断替代:
const date = new Date(); const year = date.getFullYear(); let month = date.getMonth() + 1; month = month < 10 ? `0${month}` : String(month); const path = `/v2/reports/time/team?from=${year}${month}01&to=${year}${month}31`;
补充注意:不是所有月份的最后一天都是31号,如果需要更准确的月末日期,可以通过
new Date(year, month, 0).getDate()获取对应月份的实际最后一天。
内容的提问来源于stack exchange,提问作者Adam Norton
相关产品推荐
相关产品推荐

