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

J’essaie de convertir une chaîne en object Date, et cela fonctionne pour tous les jours sauf le 31 décembre où, par object, on dit 1er décembre au lieu de 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 de variable est:

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

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

    setMonth devrait avant setDate : ( pas sûr pendant des mois moins de 31 jours )

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

    Le deuxième paramètre de setMonth pourrait également être utilisé pour définir la date.

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

    Si aucun argument n’est fourni pour le constructeur, il utilisera la date et l’heure actuelles en fonction des parameters du système.

    Ainsi, l’utilisation de setMonth et de setDate séparément entraînerait toujours un résultat inattendu.

    Si les valeurs définies sont supérieures à leur plage logique , la valeur sera automatiquement ajustée à la valeur adjacente .

    Par exemple, si aujourd’hui est le 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, définissez directement les valeurs à l’aide du constructeur.

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

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

     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 */ 

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

     dt.setDate(31) 

    Cela définit la date actuelle sur 31. Le mois en cours est septembre, ce qui signifie que 30 jours sont nécessaires.

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

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

    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.

    Donc, vous écrivez:

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

    Comme cela a déjà été établi, la définition d’une portion de 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, la mise en place de date avant le mois peut toujours provoquer un débordement inattendu (les réponses recommandant de modifier 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 

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

    Mais la vraie erreur dans votre code est que vous ne devriez pas utiliser le constructeur par défaut: new Date (). Votre code entraînera une date le 13 décembre avec l’heure actuelle. Je doute que ce soit ce que tu veux. Vous devez utiliser le constructeur Date qui prend l’année, le mois et le jour comme parameters.

    Les réponses ont clairement indiqué que le bon ordre pour fixer la date est le suivant:

    • setFullYear ()
    • setMonth ()
    • régler la date()

    Je veux juste souligner qu’il est également important de fixer l’année au début, à cause du 29 février.

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

    La valeur de passage en tant qu’entier pas la chaîne. Il retournera la valeur correcte.


    Mise à jour – la description ci-dessus n’est pas correcte. Le problème principal était que vous deviez mettre ces trois lignes dans le bon ordre. Même après avoir corrigé la séquence, j’ai oublié de corriger la description.: P