首页 > 解决方案 > 将 NgbDate 转换为 moment 以进行格式化:第一个月分配为 0 vs 1 的问题

问题描述

我有一个允许范围选择的 Ngb-Datepicker。我正在使用 moment.js 将 NgbDate 转换为 moment 对象,以便我可以根据需要转换和输出格式:例如。1月23日星期三。

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

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

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

Stackblitz: https ://stackblitz.com/edit/angular-xtrvjr?file=app%2Fdatepicker-range.ts

记录转换后的时刻时的控制台输出: 控制台输出

日期转换功能:

// 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 '';
  }
}

使用该功能的模板:

发件人:{{ formatDate(fromDate) }}
收件人:{{ formatDate(toDate) }}

标签: angularmomentjs

解决方案


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

示例: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 '';
    }
  }

推荐阅读