moment.js - 检查两个时刻是否来自同一周,但是星期五开始,周四结束

Tok*_*udi 6 javascript date node.js momentjs discord

我正在使用node.js和discord.js创建一个Discord bot,并且有一个功能允许用户通过命令进行投票,但我希望他们每周只投票一次.

问题在于,在本次Discord上,周数从周五开始,到周四结束,因此我不能简单地写道:

var weekNow = moment().week();
var weekLastVote = moment(dateLastVote).week();
if (weekNow == weekLastVote){
    //Prevent from voting again
} else {
    //Let the user vote
}
Run Code Online (Sandbox Code Playgroud)

因此,我写了一些似乎有效的代码,但我希望你对它的看法,因为它看起来很草率,我不确定我是否已经考虑到所有的可能性(我不知道我是否需要使用我的变量例如):

module.exports = {
isSameWeek: function (dateLastVote) {
    // moments for today's date
    var dayNow = moment().weekday();
    var weekNow = moment().week();
    var monthNow = moment().month();
    var yearNow = moment().year();
    var dateNow = moment().format('MMDDYYYY'); // moment without hours/minutes/seconds

    // moments for last vote's date
    var dayLastVote = moment(dateLastVote).weekday();
    var weekLastVote = moment(dateLastVote).week();
    var monthLastVote = moment(dateLastVote).month();
    var yearLastVote = moment(dateLastVote).year();
    var dateLastVote = moment(dateLastVote).format('MMDDYYYY'); // moment without hours/minutes/seconds

    if ((yearNow === yearLastVote && weekNow === weekLastVote && dayLastVote < 5) || // 5 = Friday, starting day of the week (a week = Friday to thursday)
        (yearNow === yearLastVote && weekNow - 1 === weekLastVote && dayLastVote >= 5 && dayNow < 5) || 
        (dateNow === dateLastVote)
    ){
        return true;
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

};

正如我所说的那样,这似乎可以解决这个问题,但我希望别人的意见能确保没有更简单的方法,或者如果没有,如果我没有忘记任何事情.

谢谢你阅读:)

Kev*_*ong 4

我不知道我们的方法在性能方面如何比较,但我仍然想展示我对这个问题的方法:

function isSameWeek(firstDay, secondDay, offset) {
    var firstMoment = moment(firstDay);
    var secondMoment = moment(secondDay);

    var startOfWeek = function (_moment, _offset) {
        return _moment.add("days", _moment.weekday() * -1 + (_moment.weekday() >= 7 + _offset ? 7 + _offset : _offset));
    }

    return startOfWeek(firstMoment, offset).isSame(startOfWeek(secondMoment, offset), "day");
}
Run Code Online (Sandbox Code Playgroud)

该解决方案的作用是计算每个给定日期相对于偏移量的一周开始时间(对于值 >= -7 和 <= 0),并返回两者是否具有相同的一周开始时间。同一周的开始=同一周。

您所要做的就是调用函数,传递两个日期对象(或时刻对象)和 -7 到 0 之间的偏移量,具体取决于周相对于“常规”周的移动方式。