查找给定工作日(例如,星期一)的下一个实例,其中包含 Moment.js

我想知道下个星期一或星期四的日期(如果是星期一或星期四的话,就是今天)。由于 Moment.js 在周日至周六的范围内工作,我必须计算出当前的日子,并基于此计算出下一个周一或周四:

if (moment().format("dddd")=="Sunday") { var nextDay = moment().day(1); }
if (moment().format("dddd")=="Monday") { var nextDay = moment().day(1); }
if (moment().format("dddd")=="Tuesday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Wednesday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Thursday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Friday") { var nextDay = moment(.day(8); }
if (moment().format("dddd")=="Saturday") { var nextDay = moment().day(8); }

这个可以,但肯定有更好的办法!

71603 次浏览

moment().day()会给你一个指向星期天的数字。

更好的是: moment().day(1 + 7)moment().day(4 + 7)将分别在下周一和下周四给你。

详见: http://momentjs.com/docs/#/get-set/day/

恕我直言,更优雅的方式是:

var setDays = [ 1, 1, 4, 4, 4, 8, 8 ],
nextDay = moment().day( setDays[moment().day()] );

以下内容可用于获取从现在开始的任何下一个工作日日期(或任何日期)

var weekDayToFind = moment().day('Monday').weekday(); //change to searched day name


var searchDate = moment(); //now or change to any date
while (searchDate.weekday() !== weekDayToFind){
searchDate.add(1, 'day');
}

这里的诀窍不在于使用 Moment 来指定从今天开始的某一天。它是一个概括,所以你可以在任何一天使用它,不管你在这个星期的什么地方。

首先,你需要知道你在哪里在一周: moment().day(),或稍微更可预测(尽管地区) moment().isoWeekday()。至关重要的是,这些方法返回一个整数,这使得使用比较运算符来确定相对于目标您在一周内的位置变得非常容易。

用它来判断今天的日子是比你想要的小还是大。如果它较小/相等,您可以简单地使用本周的星期一或星期四的实例..。

const dayINeed = 4; // for Thursday
const today = moment().isoWeekday();


if (today <= dayINeed) {
return moment().isoWeekday(dayINeed);
}

但是,如果今天比我们想要的日子大,你想使用同一天的 下周: “下周的星期一”,不管你在当前一周的地方。简而言之,您希望首先进入下周,使用 moment().add(1, 'weeks')。一旦你在下周,你可以选择你想要的日子,使用 moment().day(1)

一起:

const dayINeed = 4; // for Thursday
const today = moment().isoWeekday();


// if we haven't yet passed the day of the week that I need:
if (today <= dayINeed) {
// then just give me this week's instance of that day
return moment().isoWeekday(dayINeed);
} else {
// otherwise, give me *next week's* instance of that same day
return moment().add(1, 'weeks').isoWeekday(dayINeed);
}

参见 https://stackoverflow.com/a/27305748/800457


编辑: 其他评论者指出 OP 需要更具体的东西: 值数组(“下周一或周四”)的下一个值,而不仅仅是某一天的下一个实例。好的,没问题。

一般的解决方案是总体解决方案的开始。我们不是在比较一天,而是在比较一组天数: [1,4]:

const daysINeed = [1,4]; // Monday, Thursday
// we will assume the days are in order for this demo, but inputs should be sanitized and sorted


function isThisInFuture(targetDayNum) {
// param: positive integer for weekday
// returns: matching moment or false
const todayNum = moment().isoWeekday();


if (todayNum <= targetDayNum) {
return moment().isoWeekday(targetDayNum);
}
return false;
}


function findNextInstanceInDaysArray(daysArray) {
// iterate the array of days and find all possible matches
const tests = daysINeed.map(isThisInFuture);


// select the first matching day of this week, ignoring subsequent ones, by finding the first moment object
const thisWeek = tests.find((sample) => {return sample instanceof moment});


// but if there are none, we'll return the first valid day of next week (again, assuming the days are sorted)
return thisWeek || moment().add(1, 'weeks').isoWeekday(daysINeed[0]);;
}
findNextInstanceInDaysArray(daysINeed);

我将注意到,后来的一些海报提供了一个非常简洁的解决方案,它硬编码了一组有效的数值。如果您总是希望在同一天搜索,而不需要推广其他搜索,那将是更有效的 计算出来的解决方案,尽管不是最容易阅读的,也不可能扩展。

下周一:

var chosenWeekday = 1 // Monday


var nextChosenWeekday = chosenWeekday < moment().weekday() ? moment().weekday(chosenWeekday + 7) : moment().weekday(chosenWeekday)

得到下个星期一的使用时间

moment().startOf('isoWeek').add(1, 'week');

这里有一个办法可以帮助你找到下一个星期一,或者是今天,如果是星期一的话:

const dayOfWeek = moment().day('monday').hour(0).minute(0).second(0);


const endOfToday = moment().hour(23).minute(59).second(59);


if(dayOfWeek.isBefore(endOfToday)) {
dayOfWeek.add(1, 'weeks');
}

这个想法类似于 XML,但是通过简单地将缺失的天数添加到当前天数来避免 如果/否则语句。

const desiredWeekday = 4; // Thursday
const currentWeekday = moment().isoWeekday();
const missingDays = ((desiredWeekday - currentWeekday) + 7) % 7;
const nextThursday = moment().add(missingDays, "days");

我们只是通过确保增加的天数在0到6之间来进入“未来”。

这些答案中的大多数都没有回答 OP 的问题。Andrejs Kuzmins 的是最好的,但我会改进一下,这样算法就能考虑到场所了。

var nextMoOrTh = moment().isoWeekday([1,4,4,4,8,8,8][moment().isoWeekday()-1]);

下周一或其他任何一天

moment().startOf('isoWeek').add(1, 'week').day("monday");