web-dev-qa-db-fra.com

la nouvelle date () fixée au 31 décembre 2014 indique le 1er décembre à la place

J'essaie de convertir une chaîne en un objet Date, et cela fonctionne pour tous les jours sauf le 31 décembre où par objet dit le 1er décembre au lieu du 31. Je ne sais pas pourquoi. Voici mon code JavaScript:

var dt = new Date();
dt.setDate("31");
dt.setMonth("11");
dt.setFullYear("2014");

mais ma valeur variable est:

Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid)

Si je fais de même pour toute autre date, mon objet revient à la valeur appropriée. Avez-vous une idée de ce que j'ai fait de mal?

80
user2859409

Le fait est que lorsque vous définissez un jour en premier, vous êtes toujours dans le mois en cours, donc septembre. Septembre n'a que 30 jours donc:

var dt = new Date(); /* today */
dt.setDate("31"); /* 1st Oct 2014 as should be by spec */
dt.setMonth("11"); /* 1st Dec 2014 */
dt.setFullYear("2014"); /* 1st Dec 2014 */
120
Jakub Michálek

C'est parce que la première chose que vous faites est

dt.setDate(31)

Cela définit la date actuelle à 31. Le mois en cours est septembre, qui a 30 jours, il est donc complet.

Si vous deviez imprimer la date après ce point, ce serait le 1er octobre.

23
funkybro

En supposant que votre intention est de définir simultanément l'année, le mois et la date, vous pouvez utiliser le constructeur à date plus longue :

nouvelle date (année, mois, jour, heure, minute, seconde, milliseconde);

[...]

Si au moins deux arguments sont fournis, les arguments manquants sont définis sur 1 (si le jour est manquant) ou sur 0 pour tous les autres.

Vous écririez donc:

var dt = new Date(2014, 11, 31);

Comme déjà établi, la définition d'une partie de la date à la fois peut entraîner des débordements:

var dt = new Date(2012, 1, 29); // Feb 29 2012
dt.setFullYear(2014);           // Mar 01 2014 instead of Feb 28 2014

De plus, définir le mois avant la date peut toujours provoquer un débordement inattendu (les réponses qui recommandent de changer l'ordre des méthodes sont incorrectes):

var dt = new Date(2014, 0, 31); // Jan 31 2014
dt.setFullYear(2014);           // Jan 31 2014
dt.setMonth(1);                 // Mar 03 2014 instead of Feb 28 2014
dt.setDate(1);                  // Mar 01 2014
13
Salman A

Le pourquoi du comportement et comment l'éviter a été amplement expliqué.

Mais la vraie erreur dans votre code est que vous ne devez pas utiliser le constructeur par défaut: new Date (). Votre code se traduira par une date le 13 décembre avec l'heure actuelle. Je doute que c'est ce que tu veux. Vous devez utiliser le constructeur Date qui prend l'année, le mois et le jour comme paramètres.

7
Florian F