Получить дни месяца определенного года с - момент JS и Angular - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь создать пользовательский указатель даты в угловых с помощью момента JS. Проблема в том, что я не могу получить дни правильного месяца, когда год меняется

В getDaysArrayByMonth() возвращаются только месяцы 2018

  public selectedMonth: any
  private monthIterator = 0
  public daysOfSelectedMonth = [];
  public monthDaysAmount: number

  onNextMonth() {
    this.monthIterator++
    this.selectedMonth = moment().add(this.monthIterator, 'months').format('MMMM YYYY');
    this.getDaysArrayByMonth()
  }

  onPreviousMonth() {
    this.monthIterator--
    this.selectedMonth = moment().add(this.monthIterator, 'months').format('MMMM YYYY');
    this.getDaysArrayByMonth()

  }

  getDaysArrayByMonth(){
    this.daysOfSelectedMonth = []
    this.monthDaysAmount = moment().month(this.selectedMonth).daysInMonth() ;
    const remainingToEvenRows = 35 - this.monthDaysAmount
    const days = this.monthDaysAmount + remainingToEvenRows

    for (let i = 0; i < days; i++) {
      this.daysOfSelectedMonth.push(moment().month(this.selectedMonth).date(i + 1).format('Do MMMM YYYY'));
    }
  }

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Функция moment() всегда возвращает текущую дату, поэтому, если вы строите логику, она всегда возвращает текущий месяц и год. поэтому вы должны указать год, а также месяц внутри конструктора, чтобы вернуть желаемый / прошедший месяц.

поэтому измените этот код следующим образом

/// public selectedMonth: any
private monthIterator = 0
public daysOfSelectedMonth = [];
public monthDaysAmount: number

onNextMonth() {
this.monthIterator++
/// this.selectedMonth = moment().add(this.monthIterator, 'months').format('MMMM YYYY');
this.getDaysArrayByMonth(moment("201501", "YYYYMM").add(1, 'months').format('YYYYMM'));
}

onPreviousMonth() {
this.monthIterator--
/// this.selectedMonth = moment().add(this.monthIterator, 'months').format('MMMM YYYY');

this.getDaysArrayByMonth(moment("201501", "YYYYMM").add(1, 'months').format('YYYYMM'))
}

getDaysArrayByMonth(yearMonth: string){
this.daysOfSelectedMonth = []
/// this.monthDaysAmount = moment().month(this.selectedMonth).daysInMonth() ;
this.monthDaysAmount = moment(yearMonth,'YYYYMM').daysInMonth() ;
const remainingToEvenRows = 35 - this.monthDaysAmount
const days = this.monthDaysAmount + remainingToEvenRows

for (let i = 0; i < days; i++) {
  this.daysOfSelectedMonth.push(moment().month(this.selectedMonth).date(i + 1).format('Do MMMM YYYY'));
}

}

Удалите жестко запрограммированный код 201501 и передайте комбо YearMonth функции onNextMonth и onPreviousMonth.

Проверьте это stackblitz

0 голосов
/ 18 ноября 2018

this.selectedMonth сохраняет месяц и год, поэтому вы должны использовать результат в конструкторе момента:

moment(this.selectedMonth, 'MMMM YYYY')

this.monthDaysAmount = moment(this.selectedMonth, 'MMMM YYYY').daysInMonth() ;
for (let i = 0; i < days; i++) {
  this.daysOfSelectedMonth.push(moment(this.selectedMonth, 'MMMM YYYY').date(i + 1).format('Do MMMM YYYY'));
}
...