<p>必须显式传 value 且 type 与 format 严格匹配,否则输入框为空;value 推荐用 new Date() 或标准字符串,避免硬编码;format 与 type 不匹配会导致值被静默忽略;range 模式分隔符须为' - ';min/max 与 value 格式需统一。</p>
必须显式传 value,且类型和 format 严格匹配,否则输入框永远为空——这是最常被当成“插件没反应”的真因。
laydate.render 的 value 必须设为 new Date() 或标准字符串
不设 value,哪怕你点开面板看到今天被高亮,输入框也一定是空的。laydate 不会自动把“面板默认显示”同步到输入框值里。
-
value: new Date()最稳妥:自动适配本地时区,type: 'datetime'下带当前时分秒,type: 'date'下自动截断为年月日 - 避免硬编码字符串:
value: '2026-04-23'上线后第二天就失效;value: '2026-04-23 23:05:00'同理,且易与时区错位 - 若需字符串格式(如 PHP 模板中嵌入),用
new Date().toISOString().slice(0, 19).replace('T', ' '),生成2026-04-23 23:05:00这种标准形式
format 和 type 不匹配会导致 value 被静默忽略
比如 format: 'yyyy-MM-dd HH:mm:ss',但 type: 'date',此时传 new Date() 会被转成带时间的字符串,而 type: 'date' 内部强制清空时分秒,最终输入框可能显示为空或格式错乱。
- 要显示当前时分秒,
type必须是'datetime'(不是'date'或'time') -
format里写了HH:mm:ss,value就不能只给日期字符串,否则解析失败 - 验证方法:打开控制台,手动执行
laydate.now(0, 'yyyy-MM-dd HH:mm:ss'),看返回是否符合你的format
range 模式下设今日起止时间要避开分隔符陷阱
想让范围选择器一加载就默认选中“今天 00:00:00 至 23:59:59”,光拼字符串很容易失效。
- 分隔符必须是空格+短横+空格:
' - ',不是'–'(全角)、'-'(无空格)、'至' - 两端时间都得合法:若
format: 'yyyy-MM-dd HH:mm:ss',则value必须是'2026-04-23 00:00:00 - 2026-04-23 23:59:59' - 推荐构造方式:
const now = new Date(); const start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0); const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59); const valueStr = `${start.toISOString().slice(0, 19).replace('T', ' ')} - ${end.toISOString().slice(0, 19).replace('T', ' ')}`;
min/max 和 value 冲突会让默认值消失
设了 min: '2026-04-23' 却发现 value: new Date() 不生效?大概率是内部比对时因格式归一化失败,导致 value 被静默丢弃。
- 解决方案:统一用字符串,且格式一致 ——
min: '2026-04-23 00:00:00'+value: '2026-04-23 23:05:00' - 更健壮写法:用
laydate.now(0, 'yyyy-MM-dd HH:mm:ss')生成value,它内部已做时区对齐和截断 - 注意:如果
value超出min/max范围,laydate 直接忽略,不报错也不提示
真正容易被绕过去的点是:value 只在初始化时读取一次,DOM 渲染完再改 input.value 不会触发 laydate 内部状态更新;要动态重置为当前时间,得调 ins.setDate(new Date()) 或手动 dispatch change 事件——但前提是渲染时存了实例引用,且元素有合法 id。


















