bootstrap-datepicker: changeMonth returns 不同的日期结果取决于它是如何触发的,包括一个奇怪的

bootstrap-datepicker: changeMonth returns different date result depending on how it's triggered, including one strange one

我要疯了吗?您可以通过以下几种方式之一更改基本日期选择器上的日期:

  1. 单击月份名称和 select 月份
  2. 单击月份名称旁边的箭头可一次向前或向后移动一个月
  3. 点击下个月(或上个月)的一天(当月以外的“填充”天数)

根据您更改日期的方式,您会在 changeMonth 事件(或从 getformattedDate)中得到不同的报告日期,但其中一个没有意义。

如果您单击月份名称和 select 月份,则 return 是新月的第一天,一切正常。如果您单击箭头,它 return 是同一天,但在新的月份,例如如果您在 11 月 29 日,则 return 是 12 月 29 日。还是不错的。

但是,如果您点击下个月的某一天,return就是您刚刚来自的原始日期,例如如果我是在 11 月 29 日,然后单击 12 月 5 日,它仍然是 return11 月 29 日。

$('#calendar').datepicker({
  autoclose: true,
  format: "yyyy-mm-dd",
  updateViewDate: true,
  todayHighlight: false,
  immediateUpdates: true
})
.datepicker('update', '2021-11-29')
.on('changeDate', function(e){
//  console.log("changeDate: triggered", e);
})
.on('changeMonth', function(e){
    let updated_content = $('#show_date').val() + '\n' + e.date.toString() + " : " + $('#calendar').datepicker('getFormattedDate')
  $('#show_date').val(updated_content)
});

我在 https://jsfiddle.net/shaunhurley/k5ovtb9h/35/

设置了一个基本的 fiddle 来说明这种行为

我是不是漏掉了什么?

我发现通过点击日期,日期会根据实际点击日期更改,而不是根据月份更改。问题是 changeMonth 事件在日期实际更改之前被触发。

解决方法如下:

.on('changeMonth', function(){
   setTimeout(()=> {
      let updated_content = $('#show_date').val() + '\n' + $('#calendar').datepicker('getDate').toString() + " : " + $('#calendar').datepicker('getFormattedDate');
  $('#show_date').val(updated_content)
   }, 0)
})

并更新了 fiddle:https://jsfiddle.net/TokerX/8jfkua7v/