377 votes

Calculer le dernier jour du mois

Si vous fournissez 0 comme le dayValue en Date.setFullYear vous obtenez le dernier jour du mois précédent :

d = new Date(); d.setFullYear(2008, 11, 0); //  Sun Nov 30 2008

Il est fait référence à ce comportement à l'adresse suivante mozilla . S'agit-il d'une fonctionnalité inter-navigateurs fiable ou dois-je envisager d'autres méthodes ?

0 votes

Vous ne voulez pas dire le dernier jour du mois spécifié ? Il y a 30 jours en novembre et 31 en octobre.

21 votes

Les mois sont basés sur zéro en javascript, donc 11 est décembre.

3 votes

@TheCloudlessSky - essayez-le dans votre console... (2008,11,0) est le zéro jour de décembre, et donc le dernier jour de novembre.

575voto

Grant Wagner Points 14085
var month = 0; // January
var d = new Date(2008, month + 1, 0);
console.log(d.toString()); // last day in January

IE 6:                     Thu Jan 31 00:00:00 CST 2008
IE 7:                     Thu Jan 31 00:00:00 CST 2008
IE 8: Beta 2:             Thu Jan 31 00:00:00 CST 2008
Opera 8.54:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.27:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.60:               Thu Jan 31 2008 00:00:00 GMT-0600
Firefox 2.0.0.17:         Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Firefox 3.0.3:            Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)

Les différences de production sont dues à des différences dans la toString() et non parce que les dates sont différentes.

Bien sûr, le fait que les navigateurs identifiés ci-dessus utilisent 0 comme dernier jour du mois précédent ne signifie pas qu'ils continueront à le faire, ou que les navigateurs non listés le feront, mais cela donne de la crédibilité à l'idée que cela devrait fonctionner de la même manière dans tous les navigateurs.

20 votes

Cela semble fonctionner parfaitement bien. Par curiosité, qu'utilisez-vous pour exécuter le javascript sur tous ces moteurs ? Vous avez tout mis en place ou un genre d'outil ?

6 votes

Vous pouvez utiliser d.getDate() pour obtenir le jour actuel.

40 votes

"Le fait que les navigateurs utilisent 0 comme dernier jour du mois précédent ne signifie pas qu'ils continueront à le faire". Si, ils sont tenus de le faire par la norme ECMA-262.

126voto

orad Points 978

Je trouve que c'est la meilleure solution pour moi. Laissez l'objet Date le calculer pour vous.

var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);

La valeur 0 pour le paramètre "day" signifie qu'il y a un jour de moins que le premier jour du mois qui est le dernier jour du mois précédent.

3 votes

C'est bon, j'ai remarqué que la réponse sélectionnée suggère la même chose. C'est le moyen le plus rapide et le plus fiable et il fonctionne quel que soit le type de calendrier. Par exemple, si Date implémentait un calendrier autre que le calendrier grégorien, cela fonctionnerait quand même. Voir intldate.codeplex.com pour un exemple d'implémentation non grégorienne de l'objet Date.

2 votes

@orad : Méfiez-vous de la revendication de quelque chose "est le plus rapide" car cette méthode est en fait considérablement plus lente que certaines alternatives. Utilisation de new Date es donc beaucoup plus lent, il n'apparaît même pas sur le graphique de perforation : jsperf.com/days-in-month-perf-test/6

0 votes

@TrueBlueAussie OK. J'avais supposé qu'il était plus rapide parce qu'il était natif. Mais vous avez raison, ce n'est pas rapide. Merci de l'avoir testé. Quoi qu'il en soit, cette solution est la meilleure pour moi car elle est concise et lisible et, contrairement à toutes les autres solutions, elle n'est pas liée au calendrier grégorien.

82voto

karlipoppins Points 10140

J'utiliserais une date intermédiaire avec le premier jour du mois suivant, et je retournerais la date du jour précédent :

int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);

0 votes

Selon le Spécification ECMAScript Si l'on utilise le constructeur "Date" comme vous l'avez indiqué, c'est valable. En suivant l'algorithme spécifié par la fonction "MakeDay", le problème devrait être résolu de manière satisfaisante.

2 votes

C'est la meilleure solution, selon moi. J'ai essayé la réponse acceptée mais il y a un bug lors de la récupération du dernier mois en cours. Elle renvoie la date du jour. Je ne sais pas pourquoi cela se produit.

2 votes

Je ne peux pas reproduire le bug. Cela me donne une date correcte dans tous les navigateurs : today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();

29voto

lebreeze Points 3575

Mon collègue est tombé sur ce qui suit, qui pourrait être une solution plus simple.

function daysInMonth(iMonth, iYear)
{
    return 32 - new Date(iYear, iMonth, 32).getDate();
}

volé sur http://snippets.dzone.com/posts/show/2099

3 votes

Nigel a modifié cette solution pour la rendre encore plus concise. Voir son post.

0 votes

Le mois est basé sur zéro, c'est-à-dire que Jan = 0. Identique à getMonth().

21voto

Nigel Points 151

Une légère modification de la solution fournie par lebreeze :

function daysInMonth(iMonth, iYear)
{
    return new Date(iYear, iMonth, 0).getDate();
}

3 votes

Cela devrait être return new Date(iYear, 1 + iMonth, 0).getDate(); pour être équivalent à la solution de @lebreeze.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X