web-dev-qa-db-fra.com

Trouver l'instance suivante d'un jour de semaine donné (lundi) avec moment.js

Je veux connaître la date du lundi ou du jeudi suivant (ou aujourd'hui s'il s'agit de lundi ou de jeudi). Comme Moment.js travaille dans les limites d'un dimanche - samedi, je dois calculer le jour en cours et calculer le lundi ou le jeudi suivant en fonction de cela:

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

Cela fonctionne, mais il y a sûrement un meilleur moyen!

21
Mike Thrussell

Le truc ici n’est pas d’utiliser Moment pour aller à un jour particulier à partir d’aujourd’hui. C'est une généralisation, vous pouvez donc l'utiliser avec n'importe quel jour, peu importe où vous vous trouvez dans la semaine.

Vous devez d’abord savoir où vous en êtes dans la semaine: moment.day(), ou légèrement plus prévisible (malgré les paramètres régionaux) moment().isoWeekday().

Utilisez-le pour savoir si le jour d’aujourd’hui est plus petit ou plus grand que le jour de votre choix. S'il est plus petit/égal, vous pouvez simplement utiliser l'instance de lundi ou jeudi de cette semaine ...

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

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

Mais si aujourd'hui est plus grand que le jour que nous voulons, vous voulez utiliser le même jour de la semaine prochaine: "le lundi de la semaine prochaine", quel que soit l'endroit où vous vous trouvez dans la semaine en cours. En un mot, vous voulez commencer par la semaine prochaine, en utilisant moment().add(1, 'weeks'). Une fois que vous êtes dans la semaine prochaine, vous pouvez sélectionner le jour de votre choix, en utilisant moment().day(1)

Ensemble: 

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

Voir aussi https://stackoverflow.com/a/27305748/800457

59
XML

moment().day() vous attribuera un numéro faisant référence au jour_de_semaine.

Quoi de mieux: moment().day(1 + 7) et moment().day(4 + 7) vous donneront lundi prochain, jeudi prochain respectivement.

Voir plus: http://momentjs.com/docs/#/get-set/day/

10
Gavriel

Ce qui suit peut être utilisé pour obtenir n'importe quelle date du prochain jour de la semaine (ou n'importe quelle date)

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

obtenir le lundi suivant en utilisant moment

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

IMHO manière plus élégante:

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

Voici par exemple lundi prochain:

var chosenWeekday = 1 // Monday

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

La plupart de ces réponses ne répondent pas à la question du PO. Andrejs Kuzmins est le meilleur, mais je l’améliorerais un peu plus pour que l’algorithme prenne en compte les paramètres régionaux.

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

Voici une solution pour trouver le lundi suivant, ou aujourd'hui si c'est lundi:

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');
}
0
Mark C Mitchell

L'idée est similaire à celle de XML , mais évite l'instruction if/else en ajoutant simplement les jours manquants au jour actuel.

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

Nous allons seulement "vers le futur" en nous assurant que les jours ajoutés sont compris entre 0 et 6. 

0
omg_me