安全计算去年今日需用new date(年-1,月,日)构造,避免setfullyear;value须匹配format精度,推荐动态拼接或layui.util.todatestring。
必须显式计算去年今日的日期对象或字符串,new date() 默认返回今年,直接传它不会变成“去年”。
如何用 new Date() 安全算出去年今天
不能只改年份,得用 Date 构造函数重新生成,避免 2 月 29 日等边界问题失效:
-
new Date()取当前时间,再用getFullYear() - 1减一年,但直接setFullYear()可能导致 2024-02-29 → 2023-02-29(非法),浏览器会自动滚到 2023-03-01,结果不是“去年今天” - ✅ 推荐写法:用
new Date(2025, 4, 1, 14, 10, 0)这种“年月日时分秒”参数构造——注意月份是 0 起始,5 月对应4 - ⚠️ 避免
date.setFullYear(date.getFullYear() - 1),尤其在 2 月底、跨闰年时行为不可控
value 必须匹配 format,否则显示为空
比如 format: 'yyyy-MM-dd',那 value 就得是字符串 '2025-05-01' 或 Date 对象;若 format 含时间(如 'yyyy-MM-dd HH:mm:ss'),value 也得带时分秒,否则会被截断或忽略:
- ✅ 安全组合:
format: 'yyyy-MM-dd'+value: new Date(2025, 4, 1) - ✅ 带时间组合:
format: 'yyyy-MM-dd HH:mm:ss'+value: new Date(2025, 4, 1, 14, 10, 0) - ❌ 错误组合:
format: 'yyyy-MM-dd HH:mm:ss'+value: '2025-05-01'(缺时分秒,不生效)
动态生成字符串比硬编码更可靠
别写死 value: '2025-05-01',否则上线后每年都要手动改。用 JS 实时算:
- 用
toISOString().slice(0,10)不行:返回 UTC 时间,东八区下午 2 点会变成2025-04-30 - ✅ 推荐:
new Date().getFullYear() - 1拿年份,再拼getMonth() + 1和getDate(),并补零:`${y}-${String(m+1).padStart(2,'0')}-${String(d).padStart(2,'0')}` - ✅ 更省心:用
layui.util.toDateString(new Date(y, m, d), 'yyyy-MM-dd'),它内部已处理时区与格式对齐
range 模式下设“去年今天”为起止点要格外小心
如果用 range: true,且想默认选中“去年今天”一整天(即 2025-05-01 00:00:00 - 2025-05-01 23:59:59),注意三点:
- 分隔符必须是空格+短横+空格:
'2025-05-01 00:00:00 - 2025-05-01 23:59:59',不能是'–'或'-'无空格 -
type必须是'datetime',type: 'date'下即使 value 写了时间也会被丢弃 - 两端时间都得合法:结束时间用
new Date(y, m, d, 23, 59, 59)构造,别用setHours(23,59,59),后者可能因 DST 滚动出错
真正容易被忽略的是:去年今天 ≠ 去年同一天的 new Date() 副本。月份索引、闰年、时区偏移、format 格式约束,四者只要一个没对齐,输入框就空着——而且控制台还不报错。











