使用moment.js查找给定工作日(即星期一)的下一个实例

时间:2016-01-24 17:31:39

标签: javascript momentjs

我想知道下周一或周四的日期(如果是周一或周四,则为今天)。由于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); }

这很有效,但肯定有更好的方法!

10 个答案:

答案 0 :(得分:63)

这里的诀窍不在于使用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

答案 1 :(得分:10)

b会给你一个引用day_of_week的数字。

甚至更好:moment().day()moment().day(1 + 7)将分别在下周一,下周四给你。

查看更多:http://momentjs.com/docs/#/get-set/day/

答案 2 :(得分:9)

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

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

答案 3 :(得分:8)

使用时刻获得下一个星期一

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

答案 4 :(得分:2)

恕我直言更优雅的方式:

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

答案 5 :(得分:1)

这是例如下周一:

var chosenWeekday = 1 // Monday

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

答案 6 :(得分:0)

以下是寻找下周一的解决方案,如果是周一,则为今天:

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

答案 7 :(得分:0)

这个想法类似于XML的想法,但是通过简单地将缺少的日期添加到当前日期来避免了 if / else 语句。

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

我们只能通过确保添加的天数介于0到6之间来“走向未来”。

答案 8 :(得分:0)

这些答案大多数都无法解决OP的问题。 Andrejs Kuzmins'是最好的,但我会对其进行一些改进,以便该算法考虑区域设置。

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

答案 9 :(得分:0)

下周一或其他任何一天

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