如何用JavaScript为datetime-local设置1秒精度的合法时间值
问题根因
datetime-local输入控件的默认step属性值为60秒,仅支持整分钟级别的时间赋值,要求时间的秒数必须为00。你的代码生成的时间字符串携带了当前实时秒数,只要秒数不为0,就会触发步长约束校验失败,和你观察到的「下一个合法时间与赋值时间十分接近」的现象完全匹配。
修复方案
根据你的业务需求选择任意一种即可:
- 方案一:调整控件精度支持秒级输入
无需修改JS逻辑,只需给datetime-local标签添加step="1"属性,明确允许秒级时间值:
<form method="post" action="/goform/settime" name="timeform"> <input type="datetime-local" id="dt" name="dt" value="2021-11-26T10:07:11" max="2099-12-31T23:59:59" min="2000-01-01T00:00:00" step="1"> <button onclick="fillForm()">Now</button> </form>
- 方案二:调整赋值逻辑适配默认整分钟要求
无需修改HTML,修改JS代码将时间的秒数和毫秒清零,匹配默认步长约束:
function timestampToDatetimeInputString(timestamp) { const date = new Date((timestamp + _getTimeZoneOffsetInMs())); // 清空秒和毫秒,适配默认步长要求 date.setSeconds(0, 0); // 截取到分钟位即可 return date.toISOString().slice(0, 16); } function _getTimeZoneOffsetInMs() { return new Date().getTimezoneOffset() * -60 * 1000; } function fillForm() { document.forms.timeform.dt.value = timestampToDatetimeInputString(Date.now()); }
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

