直接在done回调函数的第二个参数中获取[start, end]数组,二者均为原生Date对象,可直接调用getTime()等方法;务必使用done而非change回调以确保范围完整。

laydate 日期范围选择后怎么取到两个值?
直接用 done 回调函数里的第二个参数,它就是个数组,[start, end],不是对象也不是字符串。很多人卡在这儿,以为要手动 parse 或拆分字符串,其实 LayDate 已经帮你转成 Date 对象了。
-
start和end都是原生Date实例,可直接调用.getTime()、.getFullYear()等方法 - 如果启用了
format: 'yyyy-MM-dd',回调里拿到的仍是Date对象,不是格式化后的字符串 - 别在
change回调里取范围值——它只触发单个日期变化,不保证两个都填完;必须用done
为什么 value 是字符串而 done 的参数是 Date 对象?
因为 value 是输入框显示值,受 format 控制,纯展示用途;而 done 是“选完确认”事件,LayDate 主动把用户选的逻辑时间封装成标准 Date 对象传出来,方便你做计算、提交或校验。
- 比如选了 “2024-01-01” 到 “2024-01-10”,
value是"2024-01-01 - 2024-01-10"(字符串),但done的第二个参数是[new Date(2024,0,1), new Date(2024,0,10)] - 如果你需要提交 ISO 字符串,得自己调
start.toISOString().split('T')[0]或用laydate.now(0, 'yyyy-MM-dd') - 注意月份是 0 起始,
getMonth()返回 0–11,别直接拼接
range 模式下怎么确保两个日期都填了才触发业务逻辑?
靠 done 回调本身就能保证:只有用户点确定、或回车、或失焦且范围完整时才会触发。但如果用户只选了开始没选结束,done 根本不会执行——这点常被忽略。
- 初始化时加
isRange: true,且不要设value为单个日期,否则可能降级为单选 - 若需默认值,用数组赋值:
value: ['2024-01-01', '2024-01-10'],而不是'2024-01-01 - 2024-01-10' - 服务端接收时,建议统一转成时间戳或 ISO 字符串再传,避免时区歧义;LayDate 生成的
Date对象默认按本地时区解析
常见错误:获取到 undefined 或 NaN
八成是因为没开 range 模式,或者误用了 change 回调。另一个隐蔽原因是:输入框被 JS 清空或重置过,导致 LayDate 实例内部状态丢失。
- 检查是否漏写
type: 'date'和range: true(注意是range,不是isRange——后者是旧版写法,v2.8+ 推荐用range: true) - 别用
$('#id').val('')清空输入框,改用datePickerInstance.setValue('') - 如果页面有多个 range 日期控件,每个都要独立初始化,不能共用一个
laydate.render()配置
实际用的时候,最稳的写法就是盯着 done 回调,拿数组解构,剩下的交给 Date API 处理。别碰输入框的 value 做逻辑判断,那是给用户看的,不是给代码信的。


















