laydate双向日期联动需两个独立实例,开始日期done中设结束min并reload,结束done中设开始max并reload,min/max必须为含year/month/date等字段的对象且month减1,type为datetime时须补全时间字段,value超限会清空需手动重置并再次reload。

laydate 结束日期不能早于开始日期,必须用 done 回调 + config.min 对象赋值
直接改 end.config.min = '2026-09-04' 是无效的——laydate 初始化后不监听 config 属性变化,只靠赋值不会刷新面板。必须在开始日期的 done 回调里设置结束实例的 min,并立即调用 reload()(Layui ≥ 2.8.0)或重 render(老版本)。
关键点是:min 必须是对象,不是字符串。因为你要精确到「某年某月某日某时某分」,而字符串格式会丢失时间精度,导致限制失效。
-
end.config.min = { year: date.year, month: date.month - 1, date: date.date }—— 注意month是 0 起始,date.month是 1 起始,不减 1 就会错一个月 - 如果
type: 'datetime',还得补上hours/minutes/seconds,否则默认从当天 00:00:00 开始限制,用户可能选不到“同一天的下午” - 别用
new Date(value)解析再转对象——date参数已含结构化字段,更可靠
先选结束日期时,start.config.max 也要同步设,且逻辑对称
只处理「开始 → 结束」单向联动,会导致用户先点结束框时仍可选任意日期,甚至早于还没选的开始时间。必须在结束框的 done 回调里反向约束开始框的 max。
start.config.max = { year: date.year, month: date.month - 1, date: date.date }- 同样要补时间字段(
hours/minutes/seconds),否则max会被截断为 00:00:00,把同一天的后续时间也禁掉 - 两个实例必须互相持有引用(比如
var start = laydate.render(...)和var end = laydate.render(...)),否则回调里访问不到对方实例
range: true 不适用于双向联动校验
range: true 只解决「单输入框内填两个日期」的 UI 展示和格式拆分,它不提供「开始 ≤ 结束」的实时校验能力。你设了 range: true,但用户依然可以手动输入 2026-09-10 至 2026-09-01,组件不会拦截或修正。
- 真正需要双向联动逻辑(如编辑页、表单校验),必须用两个独立 input + 两个独立
laydate.render()实例 - 不要把
range: true和分开绑定的两个实例混用,否则done回调里的date字段可能为空或错乱 - 若 UI 强要求显示为「A 至 B」样式,可用 CSS 拼接两个 input,而非依赖
range: true
value 超出新 min/max 时,输入框会静默清空
当你调 end.reload() 更新 min 后,如果当前 end.config.value 已小于新 min,laydate 会自动清空该输入框——这不是 bug,是它的保护机制。但用户感知就是「刚选完开始时间,结束框突然变空了」。
- 在
start.done里设完end.config.min后,应主动检查end.config.value是否合法:若已过期,就重置为min对应的值(比如同一天 00:00:00 或 +1 小时) - 重置后必须再调一次
end.reload(),否则 UI 不更新 - 这个逻辑容易被忽略,尤其在带初始值的编辑场景下——初始结束时间可能比新开始时间还早
真正难的不是写几行代码,而是每次改 min/max 都得同步做三件事:设对象、补全时间字段、调 reload(),漏掉任何一环,限制就形同虚设。


















