将 NgbDate 转换为用于格式化目的的时刻:第一个月分配为 0 与 1 的问题

2024-01-03

我有一个 Ngb-Datepicker,可以进行范围选择。我正在使用 moment.js 将 NgbDate 转换为 moment 对象,以便我可以按照我的意愿隐藏和输出格式:例如。 1 月 23 日星期三。

我意识到 NgbDates 给一月一个 1 值,而 moment 给一月一个 0,所以我使用myMoment.subtract(1, 'months')解决这个问题(在一个月后输出日期之前)。

我现在的问题是,那一刻仍然将原始月份的天数视为相同。因此,当我尝试选择 1 月 1 日至 1 月 31 日之间的日期范围时,它不起作用,因为 28 日之后的任何内容都无效。

仍然可以选择第 29-31 个,但是当我尝试使用formatDate()函数时,它会被视为无效日期,因为 moment 仍将其视为下个月(二月)——您会看到底部的“to:”标签不会添加日期。

堆栈闪电战:https://stackblitz.com/edit/angular-xtrvjr?file=app%2Fdatepicker-range.ts https://stackblitz.com/edit/angular-xtrvjr?file=app%2Fdatepicker-range.ts

Console output when I log my converted moment: Console output

日期转换函数:

// Convert date to "Mon Feb 01" format
formatDate(date: NgbDate) {
  const myMoment: moment.Moment = moment(date);

  // NgbDates use 1 for Jan, Moement uses 0, must substract 1 month for proper date conversion
  var convertedMoment = myMoment.subtract(1, 'months');

  if (convertedMoment.isValid()) {
    return convertedMoment.format('ddd MMM DD');
  } else {
    return '';
  }
}

使用该函数的模板:


From: {{ formatDate(fromDate) }}   

To: {{ formatDate(toDate) }}   

我想出了一个解决方案。这formatDate函数现在将 NgbDate 转换为 JSON,从 JSON 创建一个新对象,并使用它手动将值传递到新对象中moment()从月份中减去 1 后。

例子:https://stackblitz.com/edit/angular-xtrvjr-zkopwv https://stackblitz.com/edit/angular-xtrvjr-zkopwv

修复后的功能:

  formatDate(date: NgbDate) {

    // NgbDates use 1 for Jan, Moement uses 0, must substract 1 month for proper date conversion
    var ngbObj =  JSON.parse(JSON.stringify(date));
    var newMoment = moment();

    if (ngbObj) {
      ngbObj.month--;
      newMoment.month(ngbObj.month);
      newMoment.dates(ngbObj.day);
      newMoment.year(ngbObj.year);
    }

    // Convert date to "Mon Feb 01" format
    if (newMoment.isValid()) {
      return newMoment.format('ddd MMM DD');
    } else {
      return '';
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 NgbDate 转换为用于格式化目的的时刻:第一个月分配为 0 与 1 的问题 的相关文章

随机推荐