web-dev-qa-db-fra.com

Obtenez la semaine du mois

Comment puis-je obtenir le nombre de semaines du mois en utilisant javascript/jquery?

Pour ex .: 

Première semaine: 5 juillet 2010./Numéro de la semaine = Premier lundi

Semaine précédente: 12 juillet 2010./Numéro de semaine = Deuxième lundi

Date actuelle: 19 juillet 2010./Numéro de la semaine = Troisième lundi

Semaine prochaine: 26 juillet 2010./Numéro semaine = Lundi dernier

17
Prasad

function weekAndDay(date) {
    
    var days = ['Sunday','Monday','Tuesday','Wednesday',
                'Thursday','Friday','Saturday'],
        prefixes = ['First', 'Second', 'Third', 'Fourth', 'Fifth'];

    return prefixes[Math.floor(date.getDate() / 7)] + ' ' + days[date.getDay()];

}

console.log( weekAndDay(new Date(2010,7-1, 5)) ); // => "First Monday"
console.log( weekAndDay(new Date(2010,7-1,12)) ); // => "Second Monday"
console.log( weekAndDay(new Date(2010,7-1,19)) ); // => "Third Monday"
console.log( weekAndDay(new Date(2010,7-1,26)) ); // => "Fourth Monday"
console.log( weekAndDay(new Date()) );

Ajouter la possibilité d'avoir Last ... peut prendre plus de piratage ...

1
James

C'est une vieille question mais les réponses qui existent sont tout simplement fausses. Voici ma solution compatible avec plusieurs navigateurs:

    Date.prototype.getWeekOfMonth = function(exact) {
        var month = this.getMonth()
            , year = this.getFullYear()
            , firstWeekday = new Date(year, month, 1).getDay()
            , lastDateOfMonth = new Date(year, month + 1, 0).getDate()
            , offsetDate = this.getDate() + firstWeekday - 1
            , index = 1 // start index at 0 or 1, your choice
            , weeksInMonth = index + Math.ceil((lastDateOfMonth + firstWeekday - 7) / 7)
            , week = index + Math.floor(offsetDate / 7)
        ;
        if (exact || week < 2 + index) return week;
        return week === weeksInMonth ? index + 5 : week;
    };
    
    // Simple helper to parse YYYY-MM-DD as local
    function parseISOAsLocal(s){
      var b = s.split(/\D/);
      return new Date(b[0],b[1]-1,b[2]);
    }

    // Tests
    console.log('Date          Exact|expected   not exact|expected');
    [   ['2013-02-01', 1, 1],['2013-02-05', 2, 2],['2013-02-14', 3, 3],
        ['2013-02-23', 4, 4],['2013-02-24', 5, 6],['2013-02-28', 5, 6],
        ['2013-03-01', 1, 1],['2013-03-02', 1, 1],['2013-03-03', 2, 2],
        ['2013-03-15', 3, 3],['2013-03-17', 4, 4],['2013-03-23', 4, 4],
        ['2013-03-24', 5, 5],['2013-03-30', 5, 5],['2013-03-31', 6, 6]
    ].forEach(function(test){
      var d = parseISOAsLocal(test[0])
      console.log(test[0] + '        ' + 
      d.getWeekOfMonth(true) + '|' + test[1] + '                  ' +
      d.getWeekOfMonth() + '|' + test[2]); 
    });

Vous n'avez pas besoin de le mettre directement sur le prototype si vous ne le souhaitez pas. Dans mon implémentation, 6 signifie "Dernier", pas "Sixième". Si vous voulez qu'il renvoie toujours la semaine du mois, transmettez simplement true.

EDIT: Corrigé ceci pour gérer les mois de 5 et 6 semaines. Mes "tests unitaires", n'hésitez pas à bifurquer: http://jsfiddle.net/OlsonDev/5mXF6/1/ .

26
Olson.dev
week_number = 0 | new Date().getDate() / 7
4
Ishaan Puniani

Avoir du mal avec ce sujet aussi - merci à Olson.dev! J'ai raccourci un peu sa fonction, si quelqu'un est intéressé:

// returns week of the month starting with 0
Date.prototype.getWeekOfMonth = function() {
  var firstWeekday = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
  var offsetDate = this.getDate() + firstWeekday - 1;
  return Math.floor(offsetDate / 7);
}
3
Lord Midi

Cela fait quelques années déjà, mais je devais utiliser cette fonctionnalité récemment et, à certaines dates des années 2016/2020 (comme le 31 janvier), aucun code ici ne fonctionne.

Ce n'est certes pas le moyen le plus efficace, mais j'espère que cela aidera quelqu'un, car c'est la seule chose que je pourrais travailler pendant ces années-là, une année sur deux.

Date.prototype.getWeekOfMonth = function () {
    var dayOfMonth = this.getDay();
    var month = this.getMonth();
    var year = this.getFullYear();
    var checkDate = new Date(year, month, this.getDate());
    var checkDateTime = checkDate.getTime();
    var currentWeek = 0;

    for (var i = 1; i < 32; i++) {
        var loopDate = new Date(year, month, i);

        if (loopDate.getDay() == dayOfMonth) {
            currentWeek++;
        }

        if (loopDate.getTime() == checkDateTime) {
            return currentWeek;
        }
    }
};
3
Chris Dixon

Je pense que ça marche. Il retourne la semaine du mois à partir de 0:

var d = new Date();
var date = d.getDate();
var day = d.getDay();

var weekOfMonth = Math.ceil((date - 1 - day) / 7);
2
Eric
function getWeekOfMonth(date) {
  const startWeekDayIndex = 1; // 1 MonthDay 0 Sundays
  const firstDate = new Date(date.getFullYear(), date.getMonth(), 1);
  const firstDay = firstDate.getDay();

  let weekNumber = Math.ceil(`enter code here`(date.getDate() + firstDay) / 7);
  if (startWeekDayIndex === 1) {
    if (date.getDay() === 0 && date.getDate() > 1) {
      weekNumber -= 1;
    }

    if (firstDate.getDate() === 1 && firstDay === 0 && date.getDate() > 1) {
      weekNumber += 1;
    }
  }
  return weekNumber;
}

J'espère que cela fonctionne Testé jusqu'en 2025

0
Mow

Je pouvais juste trouver un code plus facile pour calculer le nombre de semaines pour un mois donné de l'année.

y == année par exemple {2012} m == est une valeur comprise entre {0 et 11}

function weeks_Of_Month( y, m ) {
    var first = new Date(y, m,1).getDay();      
    var last = 32 - new Date(y, m, 32).getDate(); 

    // logic to calculate number of weeks for the current month
    return Math.ceil( (first + last)/7 );   
}
0
Prasad

Après avoir lu toutes les réponses, j'ai trouvé un moyen d'utiliser moins de processeur que les autres et de travailler pour tous les jours de chaque mois de chaque année. Voici mon code:

function getWeekInMonth(year, month, day){

    let weekNum = 1; // we start at week 1

    let weekDay = new Date(year, month - 1, 1).getDay(); // we get the weekDay of day 1
    weekDay = weekDay === 0 ? 6 : weekDay-1; // we recalculate the weekDay (Mon:0, Tue:1, Wed:2, Thu:3, Fri:4, Sat:5, Sun:6)

    let monday = 1+(7-weekDay); // we get the first monday of the month

    while(monday <= day) { //we calculate in wich week is our day
        weekNum++;
        monday += 7;
    }

    return weekNum; //we return it
}

J'espère que cela peut aider.

0
Charles Martinez

Je pense que vous voulez utiliser weekOfMonth pour donner 1-4 ou 1-5 semaines du mois. J'ai résolu le même problème avec ceci:

var dated = new Date();
var weekOfMonth = (0 | dated.getDate() / 7)+1;
0
user3473474
function weekNumberForDate(date){

    var janOne = new Date(date.getFullYear(),0,1);
    var _date = new Date(date.getFullYear(),date.getMonth(),date.getDate());
    var yearDay = ((_date - janOne + 1) / 86400000);//60 * 60 * 24 * 1000
    var day = janOne.getUTCDay();
    if (day<4){yearDay+=day;}
    var week = Math.ceil(yearDay/7);

   return week;
}

Apparemment, la première semaine de l'année est la semaine qui contient le premier jeudi de cette année. 

Sans calculer le UTCDay, la semaine renvoyée était une semaine en deçà de ce qu'elle aurait dû être. Pas sûr que cela ne puisse pas être amélioré, mais semble fonctionner pour le moment.

0
Johnny Rockex

Veuillez essayer ci-dessous la fonction. Celle-ci considère la date de début de semaine comme lundi et la date de fin de semaine dimanche.

getWeekNumber(date) {
    var monthStartDate =new Date(new Date().getFullYear(), new 
         Date().getMonth(), 1);
    monthStartDate = new Date(monthStartDate);
    var day = startdate.getDay();
    date = new Date(date);
    var date = date.getDate();
    return Math.ceil((date+ day-1)/ 7);
}
0
Jijo Krishnan

Ce n'est rien nativement pris en charge.

Vous pouvez lancer votre propre fonction pour cela, à partir du premier jour du mois

var currentDate = new Date();
var firstDayOfMonth = new Date( currentDate.getFullYear(), currentDate.getMonth(), 1 );

Et puis obtenir le jour de la semaine de cette date:

var firstWeekday = firstDayOfMonth.getDay();

... qui vous donnera un index de base zéro, de 0 à 6, où 0 est le dimanche.

0
David Hedlund
function getWeekOfMonth(date) {

  var nth = 0; // returning variable.
  var timestamp = date.getTime(); // get UTC timestamp of date.
  var month = date.getMonth(); // get current month.
  var m = month; // save temp value of month.

  while( m == month ) {  // check if m equals our date's month.
    nth++; // increment our week count.
    // update m to reflect previous week (previous to last value of m).
    m = new Date(timestamp - nth * 604800000).getMonth();
  }

  return nth;

}
0
dzimney