web-dev-qa-db-fra.com

Moment.js comment obtenir la semaine du mois? (style de calendrier google)

J'utilise Moment.js et c'est génial. Le problème que j'ai maintenant est que je ne peux pas comprendre comment obtenir la semaine du mois à une certaine date. Je ne trouve que "semaine de l'année" dans la documentation js du moment. Par exemple, si je choisis la date d'aujourd'hui (12/02/2014), j'aimerais savoir que cette date est la deuxième semaine de ce mois de février et que, par conséquent, il s'agit du deuxième mercredi du mois. Des idées?

EDIT: Je suppose que des éclaircissements sont nécessaires. Ce dont j'ai le plus besoin, c’est le nième chiffre d’un certain jour du mois. Par exemple, (d'après les commentaires), le 1er février 2014 serait le premier samedi du mois. Le 3 février 2014 serait le premier lundi du mois même s'il s'agit "techniquement" de la deuxième semaine du mois. Fondamentalement, exactement comment la fonction de répétition de Google Agenda classe les jours.

14
train

Il semble que moment.js n’ait pas la méthode qui implémente la fonctionnalité que vous recherchez. Cependant, vous pouvez trouver que le nième numéro d’un jour de la semaine dans un mois utilise le Math.ceil du date / 7 Par exemple:

var firstFeb2014 = moment("2014-02-01"); //saturday
var day = firstFeb2014.day(); //6 = saturday
var nthOfMoth = Math.ceil(firstFeb2014.date() / 7); //1

var eightFeb2014 = moment("2014-02-08"); //saturday, the next one
console.log( Math.ceil(eightFeb2014.date() / 7) ); //prints 2, as expected

Il semble que ce soit le nombre que vous recherchez, comme le montre le test suivant

function test(mJsDate){
   var str = mJsDate.toLocaleString().substring(0, 3) +
             " number " + Math.ceil(mJsDate.date() / 7) +
             " of the month";
   return str;
}

for(var i = 1; i <= 31; i++) {
   var dayStr = "2014-01-"+ i;
   console.log(dayStr + " " + test(moment(dayStr)) );
}

//examples from the console:
//2014-01-8 Wed number 2 of the month
//2014-01-13 Mon number 2 of the month
//2014-01-20 Mon number 3 of the month
//2014-01-27 Mon number 4 of the month
//2014-01-29 Wed number 5 of the month
25
Giovanni Filardo

Lors du calcul de la semaine du mois en fonction d'une date donnée, vous devez prendre en compte le décalage. Tous les mois ne commencent pas le premier jour de la semaine.

Si vous souhaitez prendre en compte ce décalage, vous pouvez utiliser quelque chose comme ce qui suit si vous utilisez moment.

function weekOfMonth (input = moment()) {
  const firstDayOfMonth = input.clone().startOf('month');
  const firstDayOfWeek = firstDayOfMonth.clone().startOf('week');

  const offset = firstDayOfMonth.diff(firstDayOfWeek, 'days');

  return Math.ceil((input.date() + offset) / 7);
}
5
Robin Malfait

Simple en utilisant moment.js

 function semaine_du_mois (date) {
 
 préfixes = [1,2,3,4,5]; 
 
 préfixes de retour [0 | moment (date) .date ()/7] 
 
} 
4
Nishchit Dhanani

Cette bibliothèque ajoute la fonction moment.weekMonth()https://github.com/c-trimm/moment-recur

2
Keith Holliday

Il y a un problème avec la réponse de @Daniel Earwicker. J'utilisais sa fonction dans mon application et la boucle while était infinie à cause de la situation suivante:

J'essayais de savoir quelle semaine de décembre (2016) était le jour 31. Le premier jour de décembre était le jour 336 de l'année. Le dernier jour de décembre était le jour 366 de l'année.

Problème ici: quand c'était le jour 366 (le 31 décembre, dernier jour de l'année), le code a ajouté un jour supplémentaire à cette date. Mais avec un autre jour ajouté, ce serait le 1er janvier 2017. La boucle ne s'est donc jamais terminée.

 while (m.dayOfYear() <= yearDay) { 

    if (m.day() == weekDay) {
        count++; 
    }
    m.add('days', 1); 
}

J'ai ajouté les lignes suivantes au code afin que le problème soit résolu:

function countWeekdayOccurrencesInMonth(date) {

  var m = moment(date),
        weekDay = m.day(),
        yearDay = m.dayOfYear(),
        year = m.year(),
        count = 0;

 m.startOf('month');

 while (m.dayOfYear() <= yearDay && m.year() == year) {
    if (m.day() == weekDay) {
        count++;
    }
    m.add('days', 1);
 }

 return count;
}

Il vérifie si c'est toujours dans la même année de la date étant très confirmé

1
Michelle Colin

Je pense que la réponse à cette question sera utile, même si elle n’utilise pas moment.js comme demandé:

Recevez la semaine du mois

1
matthewk
function countWeekdayOccurrencesInMonth(date) {

    var m = moment(date),
            weekDay = m.day(),
            yearDay = m.dayOfYear(),
            count = 0;

    m.startOf('month');
    while (m.dayOfYear() <= yearDay) { 
        if (m.day() == weekDay) {
            count++; 
        }
        m.add('days', 1); 
    }

    return count;
}
1
Daniel Earwicker

Qu'en est-il quelque chose comme:

weekOfCurrentMonth = (moment().week() - (moment().month()*4));

Cela prend la semaine en cours de l'année et le soustrait des 4 fois le nombre de mois précédents. Ce qui devrait vous donner la semaine du mois en cours

0
Mitch Dempsey