在JavaScript中获取特定星期几的日期

22

我觉得我主要是脑抽了。我想快进一个Date()到一周中的特定某一天,然后获取那一天的月份、日期和年份。

例如,今天是09/03/10,但我希望一个名为nextSession()的函数返回09/08/10(下周三)。

我该如何做呢?我能想到的最好的方法是通过增加setDate()的天数直到getDay()等于3,但这有点丑陋……

P.S. jQuery 也很酷。

7个回答

32
function nextSession(date) {
    var ret = new Date(date||new Date());
    ret.setDate(ret.getDate() + (3 - 1 - ret.getDay() + 7) % 7 + 1);
    return ret;
}

这个函数会将日期设置为下个星期三。如果今天就是星期三,则返回给定日期的一周后。

编辑:新增了不带参数调用该函数的可能性:nextSession() - 它返回从今天开始下一个会话的日期。


修改后的代码如下:function xnextSession() { var ret = new Date(); ret.setDate(ret.getDate() + (3 - 1 - ret.getDay() + 7) % 7 + 1); return ret; }这样还能正常工作吧?我是说...看起来应该没问题... - Oscar Godson
我看到你已经改变了 var ret = new Date();,它必须是 new Date(date),因为 setDate() 只会设置月份中的日期,其他信息如月份或年份都会消失。我声明变量 ret 的原因是因为我不想改变值 datevar ret = new Date(date) 会复制对象 date,而不是引用的副本。 编辑:对不起,当然它将适用于当前日期,我没有看到所有的东西 ^^' - pepkin88
太干净了,唯一的建议是将你要前进的日期作为参数+1。 - Ender
我也不敢相信你居然使用了%(取模)运算符! - Oscar Godson
当然,那就很完美了。不过我已经决定把它绑定在星期三,因为函数名称“nextSession”暗示着星期三。 - pepkin88

8
使用DateJS库
Date.parse('next wednesday');

@Adam 谢谢,看起来很完美,但我想等一下看看是否有更轻量级的方法来完成它。25k + jQuery + jQuery UI + 我个人的40kb JS文件对于这个应用程序来说相当沉重哈哈。但是,这是一个非常酷的库。 - Oscar Godson
@Oscar - 根据你的需求,这大概是最轻量级的了。不过,你有没有尝试过压缩你的 Javascript 文件?如果还没有,强烈建议使用 YUI compressor 或 Google Closure 进行压缩。它们都可以将你的 Javascript 压缩到更小的体积。 - JasCav
@Oscar - 实际上...你不需要使用jQuery-UI来使用DateJS。而且,如果你已经在使用jQuery-UI,那么你已经有了jQuery的开销。DateJS真的没有什么用处。25kb微不足道(特别是与单个图像的大小相比)。 - JasCav
@Jason 我知道我不需要jQuery UI来使用DateJS :) 我只是用它来选择日期之类的东西。请看下面的答案。这比http://www.datejs.com/build/date.js要轻量级得多,仅仅是为了获取下周三的日期。而且我担心的不是实际文件大小,而是在IE8中的处理时间(在Firefox 3.5中稍微有些担心),谢谢,一旦进入生产环境,我可能会压缩它。谢谢! - Oscar Godson
@Oscar - 啊,我没意识到你只需要下周三。:-) 我以为你需要更通用的东西。自然语言问题又来了!很高兴你得到了答案。 - JasCav

6
如果您只需要星期三,您应该能够像这样做:
function next(today) {
    var offset = (today.getDay() < 3) ? 0 : 7;
    var daysUntilWednesday = 3 + offset - today.getDay();
    return new Date().setDate(today.getDate() + daysUntilWednesday);
}

var wed = next( new Date() );

编辑:

或者像这样?http://jsfiddle.net/zy7F8/1/

var days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];

function next(day) {

    var today = new Date();
    var today_day = today.getDay();

    day = day.toLowerCase();

    for (var i = 7; i--;) {
        if (day === days[i]) {
            day = (i <= today_day) ? (i + 7) : i;
            break;
        }
    }

    var daysUntilNext = day - today_day;

    return new Date().setDate(today.getDate() + daysUntilNext);

}

// insert a week day
alert(new Date(next( "Wednesday" )));​​​​​​​​​

编辑:更正了在同一周内输入的未来日期。


只是一条注释;for循环可以被indexOf替换。我知道循环快而且小,但我认为这样更容易阅读。此外,该函数应检查日期是否为当天,如果不是则抛出错误。 - nycynik

2
这是您需要的: http://jsfiddle.net/ePQuv/ JavaScript代码(无需jQuery)如下:
function addDays(myDate,days) {
    return new Date(myDate.getTime() + days*24*60*60*1000);
}

function subtractDays(myDate,days) {
    return new Date(myDate.getTime() - days*24*60*60*1000);
}

function dateOfNext(weekdayNumber) {
    var today = new Date();

    var lastSunday = subtractDays(today, today.getDay());

    var daysToAdd = weekdayNumber;
    if (weekdayNumber <= today.getDay()) {
        daysToAdd = daysToAdd + 7;
    }

    return addDays(lastSunday, daysToAdd);
}

这段代码的作用是从当前日期中减去当前星期的天数,以获取上个星期日的日期。然后,如果今天在你要查找的“下一个日期”之后或与其相等,则添加7天+你想要到达的星期几的天数,否则只添加星期几的天数。这将使您落在任何给定工作日的下一个日期。


2

这里是一个返回下一天数字的函数。

function nextDay(dayNb){
 return function( date ){
   return new Date(date.getTime() + ((dayNb-date.getDay() +7) %7 +1) *86400000);
 };
}

要使用它,设置你想要的日期数字 0:周一 - 6:周日

  var nextWed = nextDay(2);
  alert( nextWed( new Date() ));

1
我建议在处理日期时使用moment.js
var nextmonday = moment().day(8).format('YYYY-MM-DD'); // e.g. 2015-10-26
var nexttuesday = moment().day(9).format('YYYY-MM-DD'); // e.g. 2015-10-27
var nextwednesday = moment().day(10).format('YYYY-MM-DD'); // e.g. 2015-10-28
var nextthursday = moment().day(11).format('YYYY-MM-DD'); // e.g. 2015-10-29

你可以选择不同的格式并进行更多好玩的事情,查看:http://momentjs.com/

0

简单计算:

//for next sunday, set 0, for saturday 6; wednesday == 3;
var needDay = 3;
var fromDate = new Date(); //or any date you calculate from
fromDate.setDate(fromDate.getDate() + (7 - fromDate.getDay()) + needDay);

console.log(fromDate);

+ (7 - fromDate.getDay()): 将日期增加天数以更改日期为星期日。
+ needDay: 添加所需的日期,如果是星期三,则只需+3;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接