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

为什么给Date.setDate()传入字符串参数时会得到异常结果?

根本原因

该问题是JavaScript隐式类型转换和Date.setDate()的参数自动推算逻辑共同作用导致的,具体执行流程如下:

  • today.getDate()返回数值类型的当月日期,示例中值为12
  • 数值12和字符串'30'执行+运算时,JS会优先触发字符串拼接逻辑,最终得到字符串'1230',而非预期的数值求和结果42
  • Date.setDate()接收参数时会自动将字符串转为数值,也就是1230,会尝试将当前日期对象的当月日期设置为第1230天
  • setDate()原生支持传入超出当月天数的参数,会自动向后推算对应的远期日期:1230天换算后约为3年零4个月,最终就得到了2025年的异常结果。

修复方案

在做日期运算前,先将字符串类型的时长参数转为数值类型即可,可选写法如下:

today = new Date(); //2021-10-12
duration2 = '30'
// 方式1:用Number构造函数显式转换
new Date(new Date().setDate(today.getDate() + Number(duration2))); 
// 方式2:用+运算符隐式转数值
new Date(new Date().setDate(today.getDate() + +duration2)); 
// 方式3:用parseInt转换(仅适用于整数时长场景)
new Date(new Date().setDate(today.getDate() + parseInt(duration2, 10))); 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:36:04