Я пишу алгоритм для генерации строк в календаре.Календарь написан на AngularJS и JavaScript.Я также использую momentJS, чтобы помочь.
Для каждого месяца я строю массив недель.Объекты в массиве отображают номер недели на соответствующий год.Я делаю это таким образом, чтобы легко отображать некоторые данные с сервера.
например, март
[
{ week: 9, year: 2019 },
{ week: 10, year: 2019 },
{ week: 11, year: 2019 },
{ week: 12, year: 2019 },
{ week: 13, year: 2019 }
]
Мой алгоритм работает нормально в течение большинства месяцев, например, февраль-> ноябрь. Однако появляются декабрь и январьбыть крайними случаями.
Последняя неделя декабря может перенести на следующий год, а первая неделя января - на предыдущий.Мой алгоритм не работает для крайних случаев.
Вот код: https://codepen.io/aubz/pen/ROxKNY
Например, он не работает для DEC 2018 и JAN 2017
Ожидаемые результаты:
[
{ week: 53, year: 2016 },
{ week: 1, year: 2017 },
{ week: 2, year: 2017 },
{ week: 3, year: 2017 },
{ week: 4, year: 2017 },
{ week: 5, year: 2017 }
]
[
{ week: 51, year: 2018 },
{ week: 52, year: 2018 },
{ week: 53, year: 2018 },
{ week: 54, year: 2018 },
{ week: 1, year: 2019 }
]
Фактические результаты:
DEC 2018
[
{ week: 51, year: 2018 },
{ week: 52, year: 2018 },
{ week: 53, year: 2018 },
{ week: 54, year: 2018 },
{ week: 1, year: 2018 }
]
JAN 2017 - completely wrong
0: {week: 1, year: 2017}
1: {week: 2, year: 2017}
2: {week: 3, year: 2017}
3: {week: 4, year: 2017}
4: {week: 5, year: 2017}
Как я могу исправить свой алгоритм для учета крайних случаев?
Вот мой фрагмент алгоритма:
var data = {};
data.currentCalendarMonth = moment().startOf('month');
var result = buildListOfWeeksForCurrentMonth();
console.log(result);
function buildListOfWeeksForCurrentMonth() {
data.weeks = [];
//this could be in a different year
var startOfMonthWeekNumber = data.currentCalendarMonth.clone().startOf('month').week();
var endOfMonthWeekNumber = data.currentCalendarMonth.clone().endOf('month').week();
console.log(' startOfMonthWeekNumber ', startOfMonthWeekNumber);
console.log(' endOfMonthWeekNumber ', endOfMonthWeekNumber);
var weeksHere = [];
//TODO: end of year edge case
if (startOfMonthWeekNumber > endOfMonthWeekNumber) {
console.log(' edge cases for dec and jan ');
var weeksInYear = moment().weeksInYear();
console.log(' weeks in year ', weeksInYear);
for (var k = startOfMonthWeekNumber; k < weeksInYear + 1; k++) {
console.log(' week year ', data.currentCalendarMonth.clone().week(k).startOf('day').weekYear());
weeksHere.push({
week: k,
year: data.currentCalendarMonth.clone().week(k).startOf('day').weekYear()
});
}
for (var m = 1; m < endOfMonthWeekNumber + 1; m++) {
console.log(' week year again ', data.currentCalendarMonth.clone().get('year'));
weeksHere.push({
week: m,
year: data.currentCalendarMonth.clone().get('year')
});
}
} else {
console.log(' ususal case ');
for (var i = startOfMonthWeekNumber; i < endOfMonthWeekNumber + 1; i++) {
weeksHere.push({
week: i,
year: data.currentCalendarMonth.clone().week(i).startOf('day').weekYear()
});
}
}
console.log(' WEEKS ', weeksHere);
return weeksHere;
}