在javascript中显示一个月的一周数量的日期?

时间:2012-12-06 20:17:49

标签: javascript jquery

如何使用javascript获取一周一周的日期?

例如:

周数,月份和年份将由用户给出。

让我们说2周数,12个月和2012年。

现在我希望结果日期为3,4,5,6,7,8,9

先谢谢。

2 个答案:

答案 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)

既然你已经决定重新定义一周的开始,那么你就更难了,但是既然你问过这个问题,我很想知道这个问题。这就是我想出的:

http://jsfiddle.net/BtR3u/1/

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));

我确信有更好的方法来做我做的事情,所以不要对我大喊大叫。从试图解决这个问题来看,我的大脑已经足够炒了。很抱歉,如果变量名称很奇怪 - 有很多ijk,所以我认为最好不要使用它们......也许它会'去过。我尽力测试很多场景,但我找不到任何不起作用的东西,但我确信会出现问题。

有几点需要注意:

我决定遵循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(一个完整的,有效的一周)。但是回报的可能性很小。