Vous devez vérifier idate.getDay()
avant d'incrémenter le jour du mois. Sinon, vous obtiendrez une réponse incorrecte si le jour de la semaine souhaité tombe le premier jour du mois.
L'extrait suivant illustre la fonction corrigée.
function print(s) {
document.write(s + '<br />');
}
function nthWeekdayOfMonth(weekday, n, date) {
var count = 0,
idate = new Date(date.getFullYear(), date.getMonth(), 1);
while (true) {
if (idate.getDay() === weekday) {
if (++count == n) {
break;
}
}
idate.setDate(idate.getDate() + 1);
}
return idate;
}
// Second Sunday of the current month.
var date = new Date();
print(date = nthWeekdayOfMonth(0, 2, date));
// Second Sunday of next month.
date.setMonth(date.getMonth() + 1);
print(date = nthWeekdayOfMonth(0, 2, date));
// First Tuesday of September 2015.
print(nthWeekdayOfMonth(2, 1, new Date(2015, 8)));
// First Wednesday of September 2015.
print(nthWeekdayOfMonth(3, 1, new Date(2015, 8)));
// Second Tuesday of September 2015.
print(nthWeekdayOfMonth(2, 2, new Date(2015, 8)));
// Second Wednesday of September 2015.
print(nthWeekdayOfMonth(3, 2, new Date(2015, 8)));
body {
font-family: sans-serif;
}
Il y a une approche encore mieux qui calcule la date souhaitée sans boucle. Nous commençons par considérer le jour de la semaine du premier jour du mois. Supposons que c'est un samedi, que JavaScript appelle 6
, et que vous cherchez un dimanche, qui est 0
.
Pour obtenir le premier dimanche du mois, vous devez avancer la date de ce nombre de jours:
0 - 6 + 7
Le résultat est 1. Comment fonctionne le calcul? 0 - 6
est le nombre de jours depuis le jour de la semaine 6
jusqu'au jour de la semaine 0
, et pour transformer une valeur négative en jour de semaine valide, nous ajoutons 7
.
En général, le nombre de jours de semaine a
à jour de la semaine b
est
(b - a + 7) % 7
Pour poursuivre l'exemple, supposons que nous voulions que le premier dimanche du mois. Dans ce cas, nous sommes arrivés. Mais si nous voulons le deuxième jour du mois, nous devons avancer la date de 7 jours de plus. En général, donné n
tel que n == 1
signifie la première occurrence d'un jour de la semaine donné, nous devons avancer de (n - 1) * 7
jours.
Pour mettre tout cela ensemble, si date
est le premier jour du mois, on peut se rendre à l'apparition n
ème weekday
en avançant
(weekday - date.getDay() + 7) % 7 + (n - 1) * 7
ces derniers jours le premier jour du mois.
Cette approche est implémentée ci-dessous.
function print(s) {
document.write(s + '<br />');
}
function nthWeekdayOfMonth(weekday, n, date) {
var date = new Date(date.getFullYear(), date.getMonth(), 1),
add = (weekday - date.getDay() + 7) % 7 + (n - 1) * 7;
date.setDate(1 + add);
return date;
}
// Second Sunday of the current month.
var date = new Date();
print(date = nthWeekdayOfMonth(0, 2, date));
// Second Sunday of next month.
date.setMonth(date.getMonth() + 1);
print(date = nthWeekdayOfMonth(0, 2, date));
// First Tuesday of September 2015.
print(nthWeekdayOfMonth(2, 1, new Date(2015, 8)));
// First Wednesday of September 2015.
print(nthWeekdayOfMonth(3, 1, new Date(2015, 8)));
// Second Tuesday of September 2015.
print(nthWeekdayOfMonth(2, 2, new Date(2015, 8)));
// Second Wednesday of September 2015.
print(nthWeekdayOfMonth(3, 2, new Date(2015, 8)));
body {
font-family: sans-serif;
}
Avez-vous pris en considération le fait que le mois est 0 base (par exemple Août == 7) –
, je pense aussi aujourd'hui est en fait 24/08/15, non 24.09.15. – aaplmath
Wow .... Il calculait les choses correctement, je ne lisais pas la calculatrice correctement. –