我正在创建一个带有node.js和discord.js的Discord机器人,并且有一个功能允许用户通过命令进行投票,但我希望他们每周只投票一次。
问题在于,在此Discord上,星期五开始,周四结束,因此我不能简单地写一下:
var weekNow = moment().week();
var weekLastVote = moment(dateLastVote).week();
if (weekNow == weekLastVote){
//Prevent from voting again
} else {
//Let the user vote
}
因此,我编写了一些似乎有用的代码,但是我喜欢你对它的看法,因为它似乎非常草率,我不确定我是否考虑过所有的可能性(我不知道是否需要使用我的月变量,例如:)
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;
}
}
};
正如我所说,这似乎可以解决这个问题,但我希望其他人对此有所了解,以确保没有更简单的方法,或者,如果没有,如果我没有&忘了什么。
感谢您阅读:)
答案 0 :(得分: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");
}
解决方案的作用是计算每个给定日期相对于偏移的周的开始(对于值> = -7和&lt; = 0)并返回两者是否具有相同的一周开始。本周开始=同一周。
您所要做的就是调用函数传递两个日期对象(或时刻对象)以及-7和0之间的偏移量,具体取决于周相对于“常规”周的移动方式。
答案 1 :(得分:2)
我认为最好的方法就是告诉你的一周从星期五开始。您只需使用updateLocale
方法自定义dow
对象的week
(星期几)密钥,然后使用您的第一个代码段。请参阅文档的Customize部分,以获取有关区域设置自定义的更多信息。
这是一个将自定义日设置为一周的第一天,然后使用您的代码检查某一天是否在当前一周的实例:
moment.updateLocale('en', {
week: {
dow : 5, // Friday is the first day of the week.
}
});
function checkWeek(dateLastVote){
var weekNow = moment().week();
var weekLastVote = moment(dateLastVote).week();
if (weekNow == weekLastVote){
//Prevent from voting again
console.log(moment(dateLastVote).format('YYYY-MM-DD') + ' is in the current week')
} else {
//Let the user vote
console.log(moment(dateLastVote).format('YYYY-MM-DD') + ' is NOT in the current week')
}
}
checkWeek('2017-05-30'); // same week mon-sun, but previous week fri-thu
checkWeek('2017-06-01'); // same week mon-sun, but previous week fri-thu
checkWeek('2017-06-08'); // next week mon-sun, but current week fri-thu
// First day of the current week
console.log(moment().startOf('week').format('YYYY-MM-DD'));
// Last day of the current week
console.log(moment().endOf('week').format('YYYY-MM-DD'));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
编辑改进后的解决方案是使用'week'
作为第二个参数传递isSame
。正如文档所述:
检查片刻是否与另一时刻相同。
如果要将粒度限制为毫秒以外的单位,请将其作为第二个参数传递。
这是一个实时样本:
moment.updateLocale('en', {
week: {
dow : 5, // Friday is the first day of the week.
}
});
function isSameWeek(dateLastVote){
var now = moment();
var lastVote = moment(dateLastVote);
if (now.isSame(lastVote, 'week')){
//Prevent from voting again
console.log(moment(dateLastVote).format('YYYY-MM-DD') + ' is in the current week')
} else {
//Let the user vote
console.log(moment(dateLastVote).format('YYYY-MM-DD') + ' is NOT in the current week')
}
}
isSameWeek('2017-06-10'); // same week mon-sun, but next week fri-thu
isSameWeek('2017-06-03'); // previous week mon-sun, but current week fri-thu
isSameWeek('2017-06-06'); // current week both mon-sun and fri-thu
// First day of the current week
console.log(moment().startOf('week').format('YYYY-MM-DD'));
// Last day of the current week
console.log(moment().endOf('week').format('YYYY-MM-DD'));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
答案 2 :(得分:0)
根据Moment文档,您可以设置本周的ISO开始:
moment().isoWeekday(1); // Monday
moment().isoWeekday(7); // Sunday
然后您可以使用相同的功能来检查日期是否在一年中的同一周。