2010-12-10 34 views
0

j'ai une chaîne de l'année, le mois de début et de fin de journée sélectionner les éléments .. ans et mois de cours disponibles mais le problème est lié au nombre de jours du mois sélectionné être choisi parmi, comme le jour de départ! Je l'utilise dans le fichier JS days = new Date(2010, 4, 0).getDate(); // returns 29, ce qui est censé être 30!problème de récupération du nombre de jours dans un mois en Javascript

où est le problème, je me suis assuré des jours de chaque mois par php cal_days_in_month (0, 4, 2010) qui retourne 30

Merci d'avance :)

Répondre

1

Si vous acceptez que la date est de 1 à base, une petite astuce vous donnerait le nombre de jours d'un mois donné:

function getDaysForMonth(m,y){ 
    var datebase = new Date(y,m,1); //nb: month = zerobased 
    datebase.setDate(datebase.getDate()-1); 
    return datebase.getDate(); 
} 

Prenons pour quelques années februārī:

var feb2000 = getDaysForMonth(2,2000); //=> 29 
var feb2004 = getDaysForMonth(2,2004); //=> 29 
var feb2008 = getDaysForMonth(2,2008); //=> 29 
var feb2010 = getDaysForMonth(2,2010); //=> 28 

Vous pouvez faire une méthode Date.prototype pour elle:

Date.prototype.daysThisMonth = function(){ 
var x = new Date(this.getFullYear(),this.getMonth()+1,1); 
x.setDate(x.getDate()-1); 
return x.getDate(); 
}; 
//usage 
var d1 = new Date('2010/2/23').daysThisMonth() //=> 28 
//nb new Date('2010/2/23') in your notation: new Date(2010,1,23) 
+0

Mêmes résultats, le quatrième mois = 29! ... – Dewan159

+0

Je ne sais pas ce que vous faites, mais une nouvelle Date ('2010/04/23'). DaysThisMonth() = 30 ici; – KooiInc

0

J'utilise date.js. Il a de nombreuses fonctions de date pratiques.

+0

devrait être un commentaire A mon humble avis. – KooiInc

0

Votre code

new Date(2010, 4, 0) 

... est incorrect; cela peut fonctionner dans certaines implémentations mais pas dans d'autres. Le constructeur Date prend l'année, le mois, le jour, l'heure, la minute et la seconde (tout sauf year et month sont facultatifs, car si vous utilisez un constructeur à un argument, il suppose que vous fournissez une valeur de millisecondes depuis la valeur d'origine), et le mois est basé sur 0 mais le jour est basé sur 1 (oui, vraiment   — hey, je ne l'ai pas conçu). Donc, le premier avril est new Date(2010, 3, 1) (0 = Janvier, 1 = Février, 2 = Mars, 3 = Avril) et il n'y a pas de jour du mois 0 (conformément à la section 15.9.1.5 de la spécification, la plage est 1. .31).

+0

Merci, mais je n'ai pas vraiment compris votre point! :), voici où j'ai obtenu le code: http://www.electrictoolbox.com/javascript-days-in-month/ – Dewan159

+2

@Dewan: Mon point est que ' new Date (2010, 4, 0) 'est invalide et pourrait retourner n'importe quoi. La troisième valeur ne peut pas être «0» (selon la spécification, doit être «1» à «31» inclusivement), ce qui signifie que vous obtenez ce que vous obtenez et que vous ne pouvez pas lui faire confiance. –

0

Dans Google Chrome, il produit juste 30:

document.write (jours = new Date (2010, 4, 0) .getDate());

+0

firefox: 29!, Est le problème avec le navigateur maintenant ou quoi :) !!! – Dewan159

+0

firefox 3.6.13/w firebug 1.6: nouvelle date (2010,4,0).getDate() = 30 – KooiInc

0

Marque vous que vous utilisez le mois suivant que l'argument parce qu'il se déplace vers l'arrière lorsque le jour est 0:

new Date(2012, 1, 0); //returns Jan not Feb 

Si cela est quelque chose que vous utilisez souvent, créer une fonction

function getDaysOfMonth(year, month){ 
    return new Date(year, month+1, 0).getDate() 
}