web-dev-qa-db-fra.com

Moment js obtenant la prochaine date étant donné le jour de la semaine spécifié

Je semble avoir un peu de mal à obtenir le lundi précédent étant donné une date particulière. J'essaie d'utiliser Moment js pour la tâche. Évidemment, je peux le faire à la main, mais j'ai trouvé curieux de ne pas pouvoir le faire fonctionner en utilisant l'exemple de la documentation de moment.js sur leur site Web: http://momentjs.com/docs/#/get-set/day / .

J'essayais quelque chose comme:

moment([2013, 08, 15, 15, 20]).day(-1).format('ddd, MMM DD')

ce qui se traduit par la date "il y a deux jours", soit le 13 septembre au lieu du 9 septembre attendu.

Quelqu'un at-il une idée ici? Merci.

26
Tudor Vintilescu

Voici comment cela fonctionne:

moment().day(1) // this monday
moment().day(-6) // last monday, think of it as this monday - 7 days = 1 - 7 = -6

Il en va de même dans l'autre sens:

moment().day(8) // next monday, or this monday + 7 days = 1 + 7 = 8

Votre code moment().day(-1) peut être expliqué comme ce dimanche - 1 jour = 0 - 1 = -1 ou ce samedi - 7 jours = 6 - 7 = -1

56
mechanicalfish

La réponse acceptée ne fonctionne que si vous savez déjà si le jour en question est dans cette semaine ou la semaine prochaine. Et si tu ne sais pas? Vous avez simplement besoin du prochain jeudi disponible après une date arbitraire?

Tout d'abord, vous voulez savoir si le jour en question est plus petit ou plus grand que le jour souhaité. Si c'est plus gros, vous voulez utiliser la semaine prochaine. S'il est plus petit, vous pouvez utiliser le lundi ou le jeudi de la même semaine.

const dayINeed = 4; // for Thursday
if (moment().isoWeekday() <= dayINeed) { 
  return moment().isoWeekday(dayINeed);
} else...

Si nous avons déjà dépassé le jour que nous voulons (si, par exemple, notre moment est un vendredi et que nous voulons le prochain jeudi disponible), alors vous voulez une solution qui vous donnera "le jeudi de la semaine qui suit notre moment", quel que soit le jour où se trouve notre moment, sans aucune addition/soustraction impérative. En un mot, vous voulez d'abord aller dans la semaine prochaine, en utilisant moment().add(1, 'weeks'). Une fois que vous êtes dans la semaine suivante, vous pouvez sélectionner n'importe quel jour de la semaine que vous voulez, en utilisant moment().day(1).

Ensemble, cela vous donnera le prochain jour disponible qui répond à vos besoins, peu importe où se situe votre moment initial dans sa semaine:

const dayINeed = 4; // for Thursday

// if we haven't yet passed the day of the week that I need:
if (moment().isoWeekday() <= 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 day
  return moment().add(1, 'weeks').isoWeekday(dayINeed);
}

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

14
XML

Je pense que le fait est qu'en utilisant day() ou isoWeekday() vous obtenez une date dans la semaine en cours, peu importe quel jour de la semaine est aujourd'hui. Par conséquent, la date que vous obtenez peut être passée ou à venir.

Exemple:

si aujourd'hui est mercredi, moment().isoWeekday(5).format() retournera la date du vendredi à venir.

Alors que moment().isoWeekday(1).format() retournerait le lundi précédent.

Ainsi, lorsque vous dites que vous voulez la date de, disons, "mardi dernier", cette date peut appartenir à la semaine en cours ou à la semaine précédente, selon le jour qui est le jour.

Une fonction possible pour obtenir la date du dernier dayOfTheWeek est

function getDateOfPreviousDay(dayOfTheWeek) {
  currentDayOfTheWeek = moment().isoWeekday();   
  if ( currentDayOfTheWeek >= dayOfTheWeek ) {
    return moment().isoWeekday(dayOfTheWeek).format(); // a date in the current week
  }
  else {
    return moment().add(-1,'weeks').isoWeekday(dayOfTheWeek).format(); // a date in the previous week
  }
}
1
tHomas