2010-03-20 8 views
10

En Javascript, comment puis-je obtenir le nombre de semaines dans un mois? Je n'arrive pas à trouver de code pour ça n'importe où.Obtenir des semaines par mois via Javascript

J'ai besoin de cela pour savoir combien de lignes j'ai besoin pour un mois donné. Pour être plus précis, j'aimerais connaître le nombre de semaines qui ont au moins un jour dans la semaine (une semaine étant définie comme débutant le dimanche et se terminant le samedi).

Donc, quelque chose comme ça, je veux le savoir a 5 semaines:

S M T W R F S 

     1 2 3 4 

5 6 7 8 9 10 11 

12 13 14 15 16 17 18 

19 20 21 22 23 24 25 

26 27 28 29 30 31 

Merci pour toute l'aide.

+1

Il manque quelques paramètres à votre question. Les moyens sont plus spécifiques. Vous voulez le nombre de semaines complètes dans un mois arbitraire, ou vous voulez un nombre réel de semaines par ex. 4.3, ou vous voulez le nombre de semaines qui ont au moins un jour dans le mois? suis moi? –

Répondre

22

semaines commencent le dimanche

Cela devrait fonctionner même quand Février ne démarre pas le dimanche.

function weekCount(year, month_number) { 

    // month_number is in the range 1..12 

    var firstOfMonth = new Date(year, month_number-1, 1); 
    var lastOfMonth = new Date(year, month_number, 0); 

    var used = firstOfMonth.getDay() + lastOfMonth.getDate(); 

    return Math.ceil(used/7); 
} 

semaines commencent le lundi

function weekCount(year, month_number) { 

    // month_number is in the range 1..12 

    var firstOfMonth = new Date(year, month_number-1, 1); 
    var lastOfMonth = new Date(year, month_number, 0); 

    var used = firstOfMonth.getDay() + 6 + lastOfMonth.getDate(); 

    return Math.ceil(used/7); 
} 

semaines commencent un autre jour

function weekCount(year, month_number, startDayOfWeek) { 
    // month_number is in the range 1..12 

    // Get the first day of week week day (0: Sunday, 1: Monday, ...) 
    var firstDayOfWeek = startDayOfWeek || 0; 

    var firstOfMonth = new Date(year, month_number-1, 1); 
    var lastOfMonth = new Date(year, month_number, 0); 
    var numberOfDaysInMonth = lastOfMonth.getDate(); 
    var firstWeekDay = (firstOfMonth.getDay() - firstDayOfWeek + 7) % 7; 

    var used = firstWeekDay + numberOfDaysInMonth; 

    return Math.ceil(used/7); 
} 
+2

Utilisé ce code pour un plugin de calendrier jQuery. Merci d'avoir partagé! Vous pouvez le vérifier ici: https://github.com/joelalejandro/jquery-ja/wiki/ja.Calendar –

+1

C'est génial. Avez-vous une chance d'expliquer pourquoi cela fonctionne? – GotDibbs

+2

Ne fonctionne pas si la semaine commence le lundi;) – Titmael

3

Vous devrez le calculer.

Vous pouvez faire quelque chose comme

var firstDay = new Date(2010, 0, 1).getDay(); // get the weekday january starts on 
var numWeeks = 5 + (firstDay >= 5 ? 1 : 0); // if the months starts on friday, then it will end on sunday 

Maintenant, nous avons juste besoin genericize il.

var dayThreshold = [ 5, 1, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5 ]; 
function GetNumWeeks(month, year) 
{ 
    var firstDay = new Date(year, month, 1).getDay(); 
    var baseWeeks = (month == 1 ? 4 : 5); // only February can fit in 4 weeks 
    // TODO: account for leap years 
    return baseWeeks + (firstday >= dayThreshold[month] ? 1 : 0); // add an extra week if the month starts beyond the threshold day. 
} 

Note: Lorsque vous appelez, rappelez-vous que les mois sont indexés zéro en javascript (à savoir == Janvier 0).

1

Vous pouvez utiliser my time.js library. Voici la fonction weeksInMonth:

// http://github.com/augustl/time.js/blob/623e44e7a64fdaa3c908debdefaac1618a1ccde4/time.js#L67 

weeksInMonth: function(){ 
    var millisecondsInThisMonth = this.clone().endOfMonth().epoch() - this.clone().firstDayInCalendarMonth().epoch(); 
    return Math.ceil(millisecondsInThisMonth/MILLISECONDS_IN_WEEK); 
}, 

Il est peut-être un peu obscure puisque la viande de la fonctionnalité est endOfMonth et firstDayInCalendarMonth, mais vous devez au moins être en mesure d'obtenir une idée de la façon dont cela fonctionne.

+0

Comment appelleriez-vous la fonction dans un autre script? (Je ne suis pas encore très bon avec Javascript) –

+1

Incluez le fichier js sur votre page, et faites quelque chose comme 'new Time (2008, 11) .weeksInMonth()'. –

+1

Corrigez-moi si je me trompe, mais cela ne donnera-t-il pas le même résultat pour un mois de février avec 28 jours qui commence un dimanche et un mois de février qui commence tous les autres jours de la semaine? Ils ont tous les deux exactement 4 longueurs de semaine, mais le premier s'affichera en 4 lignes, le second en prendra 5. –

3
function weeksinMonth(m, y){ 
y= y || new Date().getFullYear(); 
var d= new Date(y, m, 0); 
return Math.floor((d.getDate()- 1)/7)+ 1;  
} 
alert(weeksinMonth(3)) 

// la plage de mois pour cette méthode est 1 (janvier) -12 (décembre)

0

Merci à Ed pauvre pour sa solution, c'est le même que le prototype de la date.

Date.prototype.countWeeksOfMonth = function() { 
    var year   = this.getFullYear(); 
    var month_number = this.getMonth(); 
    var firstOfMonth = new Date(year, month_number-1, 1); 
    var lastOfMonth = new Date(year, month_number, 0); 
    var used   = firstOfMonth.getDay() + lastOfMonth.getDate(); 
    return Math.ceil(used/7); 
} 

Ainsi, vous pouvez l'utiliser comme

var weeksInCurrentMonth = new Date().countWeeksOfMonth(); 
var weeksInDecember2012 = new Date(2012,12,1).countWeeksOfMonth(); // 6 
+0

Cela ressemble à la manière orientée objet de définir la fonction. Idéal pour ceux d'entre nous avec des compétences avancées en programmation. –

+0

Ce serait bien de pouvoir spécifier startWeekDay, par exemple Janvier 2017 commence un dimanche, c'est donc 5 semaines si la semaine commence un dimanche et 6 si la semaine commence un lundi. – Natim

+0

Natim, je pense que votre modification à mon OP est la même que ma re-post de janvier 2018. (Je ne sais pas comment utiliser l'opérateur ||, donc j'ai fait un tour de module.) –

0

Ceci est très simple à deux ligne de code. et j'ai testé 100%.

Date.prototype.getWeekOfMonth = function() { 
    var firstDay = new Date(this.setDate(1)).getDay(); 
    var totalDays = new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate(); 
    return Math.ceil((firstDay + totalDays)/7); 
} 

Comment utiliser

var totalWeeks = new Date().getWeekOfMonth(); 
console.log('Total Weeks in the Month are : + totalWeeks); 
0

Ce morceau de code vous donner le nombre exact de semaines dans un mois donné:

Date.prototype.getMonthWeek = function(monthAdjustement) 
{  
    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay(); 
    var returnMessage = (Math.ceil(this.getDate()/7) + Math.floor(((7-firstDay)/7))); 
    return returnMessage; 
} 

La variable monthAdjustement ajoute ou soustrait le mois que vous sont actuellement en

Je l'utilise dans un projet de calendrier en JS et l'équivalent en Ob jectif-C et il fonctionne bien

3

Le plus facile à comprendre est

<div id="demo"></div> 

<script type="text/javascript"> 

function numberOfDays(year, month) 
{ 
    var d = new Date(year, month, 0); 
    return d.getDate(); 
} 


function getMonthWeeks(year, month_number) 
{ 
    var $num_of_days  = numberOfDays(year, month_number) 
    , $num_of_weeks  = 0 
    , $start_day_of_week = 0; 

    for(i=1; i<=$num_of_days; i++) 
    { 
     var $day_of_week = new Date(year, month_number, i).getDay(); 
     if($day_of_week==$start_day_of_week) 
     { 
     $num_of_weeks++; 
     } 
    } 

    return $num_of_weeks; 
} 

    var d = new Date() 
     , m = d.getMonth() 
     , y = d.getFullYear(); 

    document.getElementById('demo').innerHTML = getMonthWeeks(y, m); 
</script> 
0
function getWeeksInMonth(month_number, year) { 
    console.log("year - "+year+" month - "+month_number+1); 

    var day = 0; 
    var firstOfMonth = new Date(year, month_number, 1); 
    var lastOfMonth = new Date(year, parseInt(month_number)+1, 0); 

    if (firstOfMonth.getDay() == 0) { 
    day = 2; 
    firstOfMonth = firstOfMonth.setDate(day); 
    firstOfMonth = new Date(firstOfMonth); 
    } else if (firstOfMonth.getDay() != 1) { 
    day = 9-(firstOfMonth.getDay()); 
    firstOfMonth = firstOfMonth.setDate(day); 
    firstOfMonth = new Date(firstOfMonth); 
    } 

    var days = (lastOfMonth.getDate() - firstOfMonth.getDate())+1 
    return Math.ceil(days/7);    
} 

Il a travaillé pour moi. S'il vous plaît essayer

Merci à tous

2

en utilisant un moment de

function getWeeksInMonth(year, month){ 

     var monthStart  = moment().year(year).month(month).date(1); 
     var monthEnd  = moment().year(year).month(month).endOf('month'); 
     var numDaysInMonth = moment().year(year).month(month).endOf('month').date(); 

     //calculate weeks in given month 
     var weeks  = Math.ceil((numDaysInMonth + monthStart.day())/7); 
     var weekRange = []; 
     var weekStart = moment().year(year).month(month).date(1); 
     var i=0; 

     while(i<weeks){ 
      var weekEnd = moment(weekStart); 


      if(weekEnd.endOf('week').date() <= numDaysInMonth && weekEnd.month() == month) { 
       weekEnd = weekEnd.endOf('week').format('LL'); 
      }else{ 
       weekEnd = moment(monthEnd); 
       weekEnd = weekEnd.format('LL') 
      } 

      weekRange.push({ 
       'weekStart': weekStart.format('LL'), 
       'weekEnd': weekEnd 
      }); 


      weekStart = weekStart.weekday(7); 
      i++; 
     } 

     return weekRange; 
    } console.log(getWeeksInMonth(2016, 7)) 
5

Personne de solutions proposées ici ne fonctionne pas correctement, donc je l'ai écrit ma propre variante et cela fonctionne pour tous les cas.

solution simple et travail:

/** 
* Returns count of weeks for year and month 
* 
* @param {Number} year - full year (2016) 
* @param {Number} month_number - month_number is in the range 1..12 
* @returns {number} 
*/ 
var weeksCount = function(year, month_number) { 
    var firstOfMonth = new Date(year, month_number - 1, 1); 
    var day = firstOfMonth.getDay() || 6; 
    day = day === 1 ? 0 : day; 
    if (day) { day-- } 
    var diff = 7 - day; 
    var lastOfMonth = new Date(year, month_number, 0); 
    var lastDate = lastOfMonth.getDate(); 
    if (lastOfMonth.getDay() === 1) { 
     diff--; 
    } 
    var result = Math.ceil((lastDate - diff)/7); 
    return result + 1; 
}; 

you can try it here

0
function weekCount(year, month_number, day_start) { 

     // month_number is in the range 1..12 
     // day_start is in the range 0..6 (where Sun=0, Mon=1, ... Sat=6) 

     var firstOfMonth = new Date(year, month_number-1, 1); 
     var lastOfMonth = new Date(year, month_number, 0); 

     var dayOffset = (firstOfMonth.getDay() - day_start + 7) % 7; 
     var used = dayOffset + lastOfMonth.getDate(); 

     return Math.ceil(used/7); 
    } 
0

Cela fonctionne pour moi,

function(d){ 
    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay(); 
    return Math.ceil((d.getDate() + (firstDay - 1))/7); 
} 

"d" devrait être la date.

Questions connexes