Javascript 如何修正我使用周数构建日历的算法?
我正在编写一个算法来生成日历中的行。 日历是用AngularJS和JavaScript编写的。我还使用momentJS来帮助您 对于每个月,我都在构建一系列的周。数组中的对象将周数映射到相应的年份。我这样做是为了方便地显示来自服务器的一些数据 e、 g.三月Javascript 如何修正我使用周数构建日历的算法?,javascript,angularjs,algorithm,momentjs,Javascript,Angularjs,Algorithm,Momentjs,我正在编写一个算法来生成日历中的行。 日历是用AngularJS和JavaScript编写的。我还使用momentJS来帮助您 对于每个月,我都在构建一系列的周。数组中的对象将周数映射到相应的年份。我这样做是为了方便地显示来自服务器的一些数据 e、 g.三月 [ { week: 9, year: 2019 }, { week: 10, year: 2019 }, { week: 11, year: 2019 }, { week: 12, year: 2019 },
[
{ week: 9, year: 2019 },
{ week: 10, year: 2019 },
{ week: 11, year: 2019 },
{ week: 12, year: 2019 },
{ week: 13, year: 2019 }
]
我的算法在大多数月份运行良好,例如2月->11月
然而,12月和1月似乎是边缘案例
12月的最后一周可以过渡到下一年,1月的第一周可以过渡到上一年。我的算法在边缘情况下失败
代码如下:
例如,它在2018年12月和2017年1月失败
预期成果:
[
{ 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 }
]
实际结果:
2018年12月
[
{ 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;
}
var data={};
data.currentCalendarMonth=moment().startOf('month');
var result=buildListOfWeeksForCurrentMonth();
控制台日志(结果);
函数buildListOfWeeksForCurrentMonth()的作用{
data.weeks=[];
//这可能是另一年
var startOfMonthWeekNumber=data.currentCalendarMonth.clone().startOf('month').week();
var endOfMonthWeekNumber=data.currentCalendarMonth.clone().endOf('month').week();
console.log('startOfMonthWeekNumber',startOfMonthWeekNumber);
日志('endOfMonthWeekNumber',endOfMonthWeekNumber);
var weeksHere=[];
//待办事项:年底边缘案件
如果(开始月周数>结束月周数){
日志(‘12月和1月的边缘案例’);
var weeksInYear=moment().weeksInYear();
console.log('weeks in year',weeksInYear);
对于(变量k=startOfMonthWeekNumber;k
您能否发布您的实际结果以与预期结果进行比较?获取一年的第一天,如果没有,请返回上一个星期天。然后再加上7天,直到你结束相关的一年。你能发布你的实际结果与预期结果进行比较吗?获得一年的第一天,如果没有,回到上一个星期天。然后再加上7天,直到你度过相关的一年。