bootstrap datetimepicker选中周日时如何设置为所属周的周一?
问题原因
Moment.js 默认以周日作为每周的第一天,day(1) 方法获取的是Moment 默认规则下本周的周一。而你的周视图规则是周一到周日,周日在Moment默认规则里会被归到下一周的范围,因此选中周日时调用day(1)会返回下一周的周一。
修复方案
直接替换为Moment的isoWeekday()方法即可,该方法遵循ISO周规则,天然以周一作为每周第一天、周日作为每周最后一天,完全匹配你的展示规则。
修改后的代码如下:
$('#start_date').on('dp.change', function (e) { // 优先用事件返回的日期对象,避免手动解析格式出错 const selectDate = e.date ? e.date : moment($("#start_date").val(), "YYYY-MM-DD"); const firstDateOfWeek = selectDate.isoWeekday(1).format("YYYY-MM-DD"); // 直接调用组件方法更新值,同步更新组件内部状态和显示 $(this).data("DateTimePicker").date(firstDateOfWeek); });
如果你的Moment版本不支持isoWeekday,也可以用兼容写法,先判断是否为周日再做偏移:
$('#start_date').on('dp.change', function (e) { const selectDate = moment($("#start_date").val(), "YYYY-MM-DD"); // 周日的day()返回0,提前减1天归到上一周再取周一 const firstDateOfWeek = (selectDate.day() === 0 ? selectDate.subtract(1, 'day') : selectDate).day(1).format("YYYY-MM-DD"); $("#start_date").val(firstDateOfWeek); });
注意事项
- 优先使用
dp.change事件返回的e.date对象,不需要手动读取输入框值做格式解析,避免格式不匹配导致的解析错误 - 直接调用datetimepicker的
date()方法赋值,而不是手动修改input的val,可以同步更新组件的弹窗选中状态,避免显示值和实际存储值不一致的问题
内容的提问来源于stack exchange,提问作者john tully
相关产品推荐
相关产品推荐

