Как исправить мой алгоритм использования номеров недель для построения календаря? - PullRequest
1 голос
/ 16 апреля 2019

Я пишу алгоритм для генерации строк в календаре.Календарь написан на 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;
  }
...