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

我正在用node.js和discord.js创build一个不和谐的机器人,并且有一个function允许用户通过命令进行投票,但是我希望他们每周仅投票一次。

问题是,在这个不和谐之处, 星期五从星期五开始到星期四结束 ,所以我不能简单地写:

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

因此,我写了一些似乎可以工作的代码,但是由于它看起来很潦草,所以我希望你的意见,我不确定是否考虑了所有的可能性(我不知道我是否例如需要使用我的月份variables):

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

};

正如我所说,这似乎是对的,但我希望别人的意见,以确保没有一个简单的方法,如果没有,如果我没有忘记任何东西。

感谢您阅读:)

我不知道我们的方法在performance方面如何相互比较,但是我仍然想在问题上展示我的方法:

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

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

所有你需要做的就是调用传递两个date对象(或矩对象)的函数,以及在-7和0之间的偏移量,这取决于星期如何相对于“常规”星期移动。

我认为要做到最好的方法是告诉你一周的时间是星期五。 您可以简单地使用updateLocale方法自定义week对象的dow (星期几)键,然后使用您的第一个代码片段。 请参阅自定义文档部分以获取有关区域设置自定义的更多信息。

这里有一个实例,将一个自定义日设置为一周的第一天,然后使用您的代码来检查给定的一天是否在当前星期:

 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')); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script> 

根据Moment文档,您可以设置本周的ISO开始时间:

 moment().isoWeekday(1); // Monday moment().isoWeekday(7); // Sunday 

那么你可以使用相同的function来检查这些日子是否在一年中的同一周。

看看: https : //momentjs.com/docs/#/get-set/iso-weekday/