如何使用javascript获取一周一周的日期?
例如:
周数,月份和年份将由用户给出。
让我们说2周数,12个月和2012年。
现在我希望结果日期为3,4,5,6,7,8,9
先谢谢。
答案 0 :(得分:1)
在JavaScript中使用日期时,使用库为您做一些艰苦的工作通常很方便 - 例如Moment.js:http://momentjs.com/
使用moment.js,对于你的场景,你可以从你想要的年初创建一个时刻开始。然后添加与您想要的一周相对应的周数。然后,您可以循环设置星期几(星期一,星期一等),并在循环进行时将一周中每一天的日期缓存到列表中。
E.g:
var datesOfWeek = [];
var workingDate = moment(new Date(year, 1, 1));
workingDate.add('weeks', week);
for(var dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {
workingDate.day(dayOfWeek);
datesOfWeek.push(workingDate.toDate());
}
答案 1 :(得分:0)
既然你已经决定重新定义一周的开始,那么你就更难了,但是既然你问过这个问题,我很想知道这个问题。这就是我想出的:
function getDatesByWeekNumber(year, month, weekNum, firstWeekDay) {
var ret = [];
firstWeekDay = firstWeekDay || 0;
var lastWeekDay = 7 + firstWeekDay;
var tempDate = new Date(year, month, 1);
console.log("tempDate: " + tempDate);
var daysInThisMonth = daysInMonth(year, month);
console.log("daysInThisMonth : " + daysInThisMonth);
console.log("lastWeekDay: " + (7 + firstWeekDay));
// Finds the first day of the week looking for
var curMonth = tempDate.getMonth();
var curYear = tempDate.getFullYear();
var weekCounter = 0;
while (weekCounter < weekNum-1 && (curMonth === month && curYear === year)) {
var dayCounter = 0;
var dayPerWeekCounter = tempDate.getDay();
// No more than 7 days No more than virtual last day Same month/year
while ((dayCounter < 7) && (dayPerWeekCounter < lastWeekDay) && (curMonth === month && curYear === year)) {
tempDate.setDate(tempDate.getDate() + 1);
dayPerWeekCounter++;
dayCounter++;
curMonth = tempDate.getMonth();
curYear = tempDate.getFullYear();
}
curMonth = tempDate.getMonth();
curYear = tempDate.getFullYear();
}
console.log("First day of found week: " + tempDate);
if (tempDate.getMonth() === month && tempDate.getFullYear() === year) {
// Finds each day in week specified that doesn't go out of bounds
var dayCounter = 0;
var dayPerWeekCounter = tempDate.getDay();
var dayPerMonthCounter = tempDate.getDate();
// No more than 7 days No more than virtual last day Not past end of month
while ((dayCounter < 7) && (dayPerWeekCounter < lastWeekDay) && (dayPerMonthCounter <= daysInThisMonth)) {
var cur = tempDate.getDate();
ret.push(cur);
tempDate.setDate(cur + 1);
dayCounter++;
dayPerWeekCounter++;
dayPerMonthCounter++;
}
}
return ret;
}
function copyDate(orig) {
return new Date(orig.getTime());
}
function daysInMonth(year, month) {
return new Date(year, month+1, 0).getDate();
}
var the_dates = getDatesByWeekNumber(2012, 11, 2, 1);
console.log("########FINAL ANSWER: " + JSON.stringify(the_dates));
我确信有更好的方法来做我做的事情,所以不要对我大喊大叫。从试图解决这个问题来看,我的大脑已经足够炒了。很抱歉,如果变量名称很奇怪 - 有很多i
,j
和k
,所以我认为最好不要使用它们......也许它会'去过。我尽力测试很多场景,但我找不到任何不起作用的东西,但我确信会出现问题。
有几点需要注意:
我决定遵循Javascript Date
惯例 - 从0开始的几个月,0开始的星期几,以及从1开始的几天。所以如果你想要12月,你将传入11。
就像我说的那样,你重新定义了一周的开头,所以我通过使用第4个参数(从0开始)来定制。例如,如果星期一是一周的第一天(就像它似乎与你一样),你可以使用1
。它是可选的,默认为0
,如果省略它或传递假值。
第3个参数是您要查找的月份的周数(从1开始)。例如,如果您要查找第3周,则使用3
。
它有“安全”检查,以确保它不会返回月外的天数(如果您正在查看的那一周是“28,29,30,31 ...... 1,2, 3“ - 它不会抓住最后3个。此外,它似乎适用于月初(如本月)的情况,其中第一天是在一周的中间,你想要第一周。< / p>
所以它返回的最多项目是7(一个完整的,有效的一周)。但是回报的可能性很小。