80 votes

New Date() mis au 31 décembre 2014 dit 1er décembre plutôt

Je suis en train de convertir une chaîne en un objet Date, et ça marche pour tous les jours sauf le 31 décembre où par objet dit le 1er décembre au lieu de 31. Je n’ai aucune idée pourquoi. Voici mon `` code :

mais ma valeur de la variable est :

Si je fais de même pour toute autre date, mon objet renvoie la valeur appropriée. Avez-vous une idée de ce que j’ai eu tort ?

120voto

Jakub Michálek Points 2633

Le truc, c’est lorsque vous définissez une journée tout d’abord, vous êtes toujours dans le mois en cours, donc septembre. Septembre n’a que 30 jours donc :

84voto

xdazz Points 85907

setMonth avant setDate: (pas sûr pour le Mois de moins de 31 jours)

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

Et setMonths'deuxième paramètre peut également être utilisé pour régler la date.

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


Si aucun argument n'est fourni pour le constructeur, il va utiliser la date et l'heure en fonction des paramètres système.

Ainsi, l'utilisation de setMonth et setDate séparément serait encore causer résultat inattendu.

Si les valeurs sont supérieures à celles de leurs logiques de gamme, la valeur sera automatiquement ajustée à la valeur adjacent.

Par exemple, si, aujourd'hui, est - 2014-09-30, alors

var dt = new Date();
dt.setFullYear(2014); /* Sep 30 2014 */
dt.setMonth(1);       /* Mar 02 2014, see, here the auto adjustment occurs! */
dt.setDate(28);       /* Mar 28 2014 */

Pour éviter cela, réglez les valeurs en utilisant le constructeur directement.

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

23voto

funkybro Points 5193

C’est parce que la première chose à que faire est

Ceci affecte la date actuelle à 31. Le mois en cours est septembre qui dispose de 30 jours, donc il est enveloppant rond.

Si vous deviez imprimer la date après ce point, je dirais 1 octobre.

13voto

Salman A Points 60620

En supposant que votre intention est de régler l'année, le mois et la date en même temps, vous pourriez utiliser le plus constructeur de date:

new Date(année, mois, jour, heure, minute, seconde, milliseconde);

[...]

Si au moins deux arguments sont fournis, les arguments manquants sont soit mis à 1 (si le jour est manquant) ou 0 pour tous les autres.

Donc, on peut écrire:

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

Comme l'a déjà établi, définissant 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

En outre, réglage) mois avant la date peut encore provoquer inattendu de débordement (les réponses que nous recommandons de changer l'ordre des méthodes 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

7voto

Florian F Points 239

Le pourquoi du comportement et comment l’éviter ont été amplement expliqué.

Mais la véritable erreur dans votre code, c’est que vous ne devriez pas utiliser le constructeur par défaut : new Date(). Votre code se traduira par une Date sur le 13 décembre, à l’heure actuelle. Je doute que c’est ce que vous voulez. Vous devez utiliser le constructeur de Date qui prend de l’année, mois et jour en tant que paramètres.

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