如何用 <input type=datetime-local> 的 step 设置 15 分钟间隔?
15 分钟应写成 step="900"。datetime-local 的 step 以秒为单位,15 × 60 = 900。这些属性能约束输入值,但不能保证浏览器的选择面板只显示指定时间。如果要求用户只能看到并选择每天 08:00 至 18:00、间隔 15 分钟的选项,用日期输入框配合自动生成的 <select> 更合适。
step 限制有效值,选择面板由浏览器决定
step、min 和 max 定义输入值的约束。日期和时间选择器的样式、选项会因浏览器和操作系统而异,无法靠这些属性统一控制。
例如,只允许预约某一天的 08:00 至 18:00,可以这样写:
<form>
<label for="bookingDateTime">预约日期和时间</label>
<input
type="datetime-local"
id="bookingDateTime"
name="bookingDateTime"
min="2026-12-01T08:00"
max="2026-12-01T18:00"
step="900"
required
>
<button type="submit">提交预约</button>
</form>
示例中的日期应替换成实际可预约日期。使用这些属性时:
datetime-local的min和max必须包含日期,不能只写min="08:00"。- 有效的
min会作为步长计算基准。示例从08:00开始,每隔 900 秒一个有效值,因此08:15有效,08:10不符合步长要求。 - 选择面板显示的时间,也可能无法通过表单校验。
具体规则见 HTML 标准中的 datetime-local 和 step 定义。
跨日期的 min、max 无法表达每天的营业时间
假设设置:
min="2026-12-01T08:00"
max="2026-12-31T18:00"
这表示从 12 月 1 日 08:00 到 12 月 31 日 18:00 的连续范围,12 月 2 日的 03:00 也在其中。因此,要限制每天只接受 08:00 至 18:00 的预约,更适合把日期和时间拆开处理。
只显示指定时间:用循环生成 <select>
日期用 <input type="date"> 选择,时间下拉框用 JavaScript 生成。下面的代码可以直接放入页面:
<form>
<p>
<label for="bookingDate">预约日期</label>
<input
type="date"
id="bookingDate"
name="bookingDate"
required
>
</p>
<p>
<label for="bookingTime">预约时间</label>
<select id="bookingTime" name="bookingTime" required>
<option value="">请选择时间</option>
</select>
</p>
<button type="submit">提交预约</button>
</form>
<script>
const timeSelect = document.getElementById("bookingTime");
const startMinutes = 8 * 60;
const endMinutes = 18 * 60;
const intervalMinutes = 15;
for (
let minutes = startMinutes;
minutes <= endMinutes;
minutes += intervalMinutes
) {
const hours = String(Math.floor(minutes / 60)).padStart(2, "0");
const mins = String(minutes % 60).padStart(2, "0");
const time = `${hours}:${mins}`;
timeSelect.add(new Option(time, time));
}
</script>
循环从 08:00 开始,依次生成 08:15、08:30 等选项,直到 18:00,共 41 个。按分钟数递增,就不用手动处理小时进位。
new Option(time, time) 的第一个参数是显示文字,第二个参数是提交值。原问题中的 <option value="08:00"></option> 没有显示文字,应写成:
<option value="08:00">08:00</option>
几十个 <option> 本身没有问题,用循环生成更便于维护。调整营业时间或间隔时,只需修改几个变量。如果页面需要在禁用 JavaScript 时仍能使用,也可以在服务端循环输出这些选项。
只要求校验时,也可以使用原生时间输入框
如果可以接受浏览器自带的时间选择界面,可以将日期输入框与下面的时间输入框配合使用:
<label for="bookingTime">预约时间</label>
<input
type="time"
id="bookingTime"
name="bookingTime"
min="08:00"
max="18:00"
step="900"
required
>
type="time" 支持不带日期的 min、max,step 同样以秒为单位,见 HTML 标准的 Time state 定义。它能表达每天的时间约束,但不能保证选择面板只列出这些时间点。如果需要只提供指定选项,就用前面的 <select>。
预约边界还需要确认
代码允许在 18:00 开始预约,所以循环使用 <= endMinutes。如果要求拍摄必须在 18:00 前结束,应根据拍摄时长,将最后一个可预约时间提前。
接入预约服务时,服务端还应校验日期、时间间隔和营业时间,并检查时段是否已被占用。前端下拉框提供可选时间,最终能否预约以服务端校验为准。
备注:内容仅供参考。
