layui日期范围选择后,start和end值直接从done回调的第二个参数对象中获取,为格式化字符串(如"yyyy-MM-dd"),无需解析value或手动拼接,且多实例时可通过闭包或this.elem区分。

layui datepicker 范围选择后怎么拿到 start 和 end 值
直接看 done 回调里的参数——它传进来的第二个参数是对象,里面就有 start 和 end 两个字符串,格式是 "yyyy-MM-dd"(默认),不是 Date 对象,也不是时间戳。
常见错误是去查 value 或者试图用 laydate.getDateTime() 手动拼,其实完全没必要。
-
start和end是已经格式化好的字符串,可直接提交或用于查询 - 如果需要转成时间戳,用
new Date(val).getTime()即可,注意传入的是字符串,且需确保格式合法 - 若选了“今天”,
start和end会是同一天;若跨年,也照常返回,无需额外处理
为什么 value 里只有一段字符串,不是两个值
因为 value 是输入框最终显示的文本,比如 "2024-01-01 - 2024-01-31",它只是 UI 层展示用的,不能直接拆分解析——万一用户手动改过输入框内容,或者用了自定义分隔符(如 ~),就不可靠。
真正可信的数据源只有 done 回调的第二个参数对象。
- 永远优先取回调参数里的
start/end,别碰value - 不要用
input.val().split(" - ")这类方式提取,容易因空格、语言、分隔符变化而失败 - 如果必须从 input 取值(比如表单统一序列化),请确保后端做了容错解析,或前端加一层校验
format 改变后,start/end 还是字符串吗
是的,不管 format 设成 "yyyy/MM/dd" 还是 "yyyy-MM-dd HH:mm:ss",start 和 end 的类型始终是字符串,内容就是按你设的 format 格式输出的。
但注意:如果你开了 range: true,且 format 包含时间(如 "yyyy-MM-dd HH:mm"),那 start/end 就带时分,否则只有日期。
- 时间部分默认是
00:00:00(开始)和23:59:59(结束),但这是 layui 内部逻辑,不暴露给回调参数 - 若需精确到秒的范围,建议在回调里自己补全,比如
start + " 00:00:00"、end + " 23:59:59" - 不要依赖
start/end自带时间精度,尤其当 format 不含时间时,它们就是纯日期字符串
多实例共存时,怎么区分哪个是哪个的 start/end
靠回调函数的闭包或 this 上下文。layui 的 done 回调中,this 指向当前 laydate 实例的配置对象,里面有 elem(绑定的 DOM 元素)可以用来识别来源。
更稳妥的做法是把实例 ID 或字段名通过闭包传进去,而不是全局变量。
- 避免写
var startDate, endDate;然后在多个 done 里赋值——容易覆盖 - 推荐写法:
done: function(value, date, endDate) { console.log("订单时间:", date.start, date.end); },每个实例独立处理 - 如果用 jQuery 绑定多个 input,可在初始化前用
$(this).data("field", "orderTime")打标,回调里再读
layui 的 range 模式本身不复杂,关键点就一个:所有可靠数据都在 done 回调的第二个参数里,其他地方都是干扰项。时间格式、多实例、手动修改输入框——这些坑都绕不开这个前提。


















