#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 марта в другие годы, пропуская февраль.