Javascript как получить полные два года с текущего месяца?

#javascript #html #css #reactjs #date

#javascript #Дата

Вопрос:

У меня есть вопрос о получении полных двух лет с текущей даты. Итак, что я сделал, так это получил текущий месяц с помощью new Date() и использовал for цикл для печати каждого из месяцев. Но я не могу заставить это работать… Я опубликую код, который я попробовал ниже. Я был бы очень признателен, если бы кто-нибудь мог подсказать мне логику или лучший способ сделать это.

Например:
если текущая дата равна 8 августа 2020 года, создается массив со значениями "8/2020" , "9/2020" "7/2022" , "8/2022" .

 var d = new Date();

var year = d.getFullYear();

var dateStr;
var currentYear;

var storeMonthYear = [];

for (var i = 1; i <= 24; i  ) {
    dateStr = d.getMonth()   i
    currentYear = year;
    
    if (dateStr > "12") {
        dateStr = dateStr - 12

        // currentYear = year;
        // if (currentYear) {

        // }

        storeMonthYear[i] = dateStr   "/"   (currentYear   1);
    } else if (dateStr > "24") {
        storeMonthYear[i] = dateStr   "/"   (currentYear   1);
    } else {
        storeMonthYear[i] = dateStr   "/"   currentYear;
    }

    storeMonthYear[i] = d.getMonth()   i
}

export const settlementPeriod = [{
    MonthYearFirstRow1: storeMonthYear[1],
    MonthYearFirstRow2: storeMonthYear[2],
    MonthYearFirstRow3: storeMonthYear[3],
    MonthYearFirstRow4: storeMonthYear[4],
    MonthYearFirstRow5: storeMonthYear[5],
    MonthYearFirstRow6: storeMonthYear[6],
    MonthYearFirstRow7: storeMonthYear[7],
    MonthYearFirstRow8: storeMonthYear[8],
    MonthYearFirstRow9: storeMonthYear[9],
    MonthYearFirstRow10: storeMonthYear[10],
    MonthYearFirstRow11: storeMonthYear[11],
    MonthYearFirstRow12: storeMonthYear[12],

    MonthYearSecondRow13: storeMonthYear[13],
    MonthYearSecondRow14: storeMonthYear[14],
    MonthYearSecondRow15: storeMonthYear[15],
    MonthYearSecondRow16: storeMonthYear[16],
    MonthYearSecondRow17: storeMonthYear[17],
    MonthYearSecondRow18: storeMonthYear[18],
    MonthYearSecondRow19: storeMonthYear[19],
    MonthYearSecondRow20: storeMonthYear[20],
    MonthYearSecondRow21: storeMonthYear[21],
    MonthYearSecondRow22: storeMonthYear[22],
    MonthYearSecondRow23: storeMonthYear[23],
    MonthYearSecondRow24: storeMonthYear[24]    
}];
  

Комментарии:

1. В массиве вы хотите структуру, подобную этой [М / ГГГГ, M / YYYY, …] и без объектов даты?

Ответ №1:

Создайте дату с сегодняшнего дня, получите месяц и год. Выполните итерацию от 0 до 24 на данный момент до 24 месяцев. Если месяц равен 12, установите месяц равным 0 и увеличьте год. Введите новую строку даты. Увеличьте месяц для следующего шага.
Примечание: Beacsue JS считает месяцы формы 0-11, которые вы должны были добавить для datestring 1 для месяца и внести изменение года в 12, а не 13.

 let date = new Date();
let year = date.getFullYear();
let month = date.getMonth();

let res=[];
for (let i=0; i<=24; i  ) {
   if (month===12) {
       month = 0;
       year  ;
   }
   res.push(month 1   '/'   year);
   month  ;
}

console.log(res);  

Комментарии:

1. Рад вам помочь. Если вы удовлетворены этим, вы можете принять мой ответ.

Ответ №2:

Есть пара вещей, которые выделяются в вашем примере кода:

  • Вы сравниваете строки и числа (например dateStr > "12" ). Это приведет к некоторым странным ошибкам и является одной из наиболее легко используемых «функций» JS. Избегайте этого, где это возможно.
  • Вы увеличиваете год, когда достигаете 12 месяцев с этого момента, а не когда достигаете следующего января
  • Вы перезаписываете свои строки этой строкой storeMonthYear[i] = d.getMonth() i , поэтому ваш массив представляет собой набор чисел, а не строк даты, как вы ожидаете

Вот пример кода, который, я думаю, делает то, что вы ожидаете:

 function next24Months() {
  const today = new Date()

  let year = today.getFullYear()
  let monthIndex = today.getMonth()

  let dates = []

  while (dates.length < 24) {
    dates.push(`${monthIndex   1}/${year}`)

    // increment the month, and if we're past December,
    // we need to set the year forward and the month back
    // to January
    if (  monthIndex > 11) {
      monthIndex = 0
      year  
    }
  }

  return dates
}
  

В общем, когда вы имеете дело с датами, вам, вероятно, лучше использовать библиотеку типа Moment.js — даты / время являются одной из самых сложных концепций программирования.

Ответ №3:

Здесь вы получаете массив строк типа «8/2020», «9/2020» и т.д. От начального месяца до последнего месяца, включая оба (всего 25 месяцев). Если вы не хотите включать прошлый месяц, просто удалите 1 из условия цикла for.

 let currentDate = new Date();

let settlementPeriod = [];

let numberOfMonths = 24;

for(let i=0;i<numberOfMonths 1;i  ){
    settlementPeriod.push(currentDate.getMonth() 1 "/" currentDate.getFullYear()); //We add current date objects attributes to the array
    currentDate = new Date(currentDate.setMonth(currentDate.getMonth() 1)); //Every time we add one month to it
}
console.log(settlementPeriod);
  

Комментарии:

1. Большое вам спасибо! я посмотрю на это

2. Попробуйте добавить 1 месяц к 31 января, используя этот метод.

Ответ №4:

Хотя ответ @Ognjen верен, это также немного полезно, если ваша дата никогда не выходит за рамки своей функции.

Вам не нужна новая дата каждый раз:

 function getPeriods(firstMonth, numPers){
  var d = new Date(firstMonth.getTime()); // clone the start to leave firstMonth alone
  d.setDate(1); // fix after @RobG
  var pers = [];
  var m;
  for(var i = 0; i< numPers; i  ){ 
     m = d.getMonth();
     pers.push(`${m  1}/${d.getFullYear()}`)
     d.setMonth(m   1); // JS dates automatically roll over. You can do this with d.setDate() as well and when you assign 28, 29, 31 or 32 the month and year roll over automatically
  }
  return pers;
}
  

Комментарии:

1. Ответ Огньена неверен. Если код запускается 31 января, то добавление 1 месяца вернет 2 марта в високосные годы и 3 марта в другие годы, пропуская февраль.