Преобразование NgbDate в момент для форматирования: проблема с первым месяцем, назначенным как 0 против 1 - PullRequest
0 голосов
/ 07 января 2019

У меня есть Ngb-Datepicker, который позволяет выбрать диапазон. Я использую moment.js для преобразования NgbDate в моментный объект, чтобы я мог конвертировать и выводить формат так, как мне хотелось бы: ex. Ср. 23 января.

Я понял, что NgbDates присваивает январю значение 1, а момент дает январю 0, поэтому я использовал myMoment.subtract(1, 'months'), чтобы разрешить это (до того, как даты были выведены как месяц спустя).

Моя проблема сейчас в том, что в этот момент количество дней по сравнению с исходным месяцем остается одинаковым. Поэтому, когда я пытаюсь выбрать диапазон дат, скажем, с 1 января по 31 января, он не работает, потому что все, что больше 28, недопустимо.

29-31-й по-прежнему можно выбрать, но когда я пытаюсь вывести его с помощью функции formatDate(), он считается недопустимой датой, поскольку момент все равно обрабатывает его как следующий месяц (февраль) - вы Вы увидите, что на ярлыке «to:» внизу не будет добавлена ​​дата.

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

Вывод на консоль, когда я регистрирую конвертированный момент: 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) }} 

1 Ответ

0 голосов
/ 07 января 2019

Я нашел решение для этого. Функция 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 '';
    }
  }
...