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
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 ...
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/ .
week_number = 0 | new Date().getDate() / 7
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);
}
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;
}
}
};
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);
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
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 );
}
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.
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;
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.
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);
}
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.
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;
}