DataTables DateTime首次选择日期返回值带时分秒异常问题
DataTables DateTime首次选日期带时分秒问题修复
问题根因
该现象不是组件随机Bug,是DateTime默认逻辑导致的必然结果:
- 初始化时配置
format: 'll'仅控制输入框内的显示格式,组件内部默认存储的初始值是当前本地时间的完整Date对象(携带触发选择时的时分秒信息) - 首次选择日期时,组件仅替换内部Date对象的年、月、日属性,不会主动将时分秒重置为0;只有完成至少一次日期选择、组件完成格式重渲染后,后续选择日期才会按照纯日期格式将时分秒置为
00:00:00 - 你在change事件中用
M/D/YYYY格式解析返回值时,首次拿到的字符串携带时分秒,moment触发容错解析,最终得到带当前时分秒的错误时间戳。
可直接复用的修复方案
二选一即可,优先推荐方案2,兼容性更强。
方案1:初始化时锁死默认时间为当日0点
在DateTime初始化配置中新增defaultTime参数,从根源避免初始值携带当前时分秒:
// 开始日期初始化 callsminDate = new DateTime($('#callsmin'), { format: 'll', buttons: { clear: true }, defaultTime: '00:00:00' // 新增配置 }); // 结束日期初始化 callsmaxDate = new DateTime($('#callsmax'), { format: 'll', buttons: { clear: true }, defaultTime: '00:00:00' // 新增配置 });
方案2:取值时强制对齐当日起始时间
不依赖组件返回的字符串格式,转时间戳时统一取当日0点的时间戳,同时兼容清除按钮的空值场景:
// Refilter the table $('#callsmin, #callsmax').on('change', function () { callstable.draw(); // 空值时返回null避免解析报错,非空值强制取当日0点时间戳 mincallsts = callsminDate.val() ? moment(callsminDate.val()).startOf('day').unix() : null; maxcallsts = callsmaxDate.val() ? moment(callsmaxDate.val()).startOf('day').unix() : null; console.log(mincallsts); });
该方案不需要修改原有初始化配置,即使后续调整日期显示格式也不会影响时间戳计算逻辑。
内容的提问来源于stack exchange,提问作者user2787710
相关产品推荐
相关产品推荐

