web-dev-qa-db-fra.com

Date Javascript: le mois prochain

J'utilise la date de Javascript pour un projet, mais je constate aujourd'hui que mon code qui fonctionnait auparavant ne fonctionne plus correctement. Au lieu de produire février comme prévu, le code ci-dessous produit mars. 

Mon code ressemble à ceci: 

current = new Date();
current.setMonth(current.getMonth()+1); //If today is Jan, expect it to be Feb now

Ce code a fonctionné tous les jours jusqu'à aujourd'hui. Est-ce un bug Javascript ou est-ce que je m'y prend mal? 

32
Ronald

Vous constaterez probablement que vous fixez la date au 31 février 2009 (si nous sommes aujourd'hui le 31 janvier) et que Javascript le reporte automatiquement au début du mois de mars.

Vérifiez le jour du mois et attendez-vous à être égal à 1, 2 ou 3. Si ce n'est pas la même chose qu'avant l'ajout d'un mois, annulez d'un jour jusqu'à ce que le mois change à nouveau.

De cette façon, le jour "dernier jour de janvier" devient "dernier jour de février".

MODIFIER:

Ronald, sur la base de vos commentaires sur d’autres réponses, vous voudrez peut-être éviter le comportement de cas Edge tel que "que se passe-t-il lorsque je tente de gagner le 30 février" ou "que se passe-t-il lorsque je tente de préparer le 2009/13/07 (aaaa/mm/jj) "(ce dernier problème peut toujours poser problème même pour ma solution, vous devriez donc le tester).

Au lieu de cela, je coderais explicitement pour les possibilités. Puisque vous ne vous souciez pas du jour du mois (vous voulez juste que l'année et le mois soient corrects pour le mois prochain), quelque chose comme ceci devrait suffire:

var now = new Date();
if (now.getMonth() == 11) {
    var current = new Date(now.getFullYear() + 1, 0, 1);
} else {
    var current = new Date(now.getFullYear(), now.getMonth() + 1, 1);
}

Cela vous donne le 1er janvier de l’année suivante pour n’importe quel jour de décembre et le premier jour du mois suivant pour n’importe quel autre jour. Je connais plus de code, mais je me suis depuis longtemps fatigué des astuces de codage pour plus d’efficacité, préférant la lisibilité à moins d’exiger clairement le contraire.

46
paxdiablo

Au lieu de cela, essayez:

var now = new Date();
current = new Date(now.getFullYear(), now.getMonth()+1, 1);
27
Brannon

Je cherchais une solution simple à une ligne pour obtenir le mois prochain par le biais de mathématiques afin de ne pas avoir à rechercher les fonctions de date javascript (paresse mentale de ma part). Étrangement, je n'en ai trouvé aucun ici.

J'ai surmonté mon bref accès de paresse, en ai écrit un et décidé de partager!

Solution:

(new Date().getMonth()+1)%12 + 1

Juste pour bien comprendre pourquoi cela fonctionne, laissez-moi décomposer la magie!

Il obtient le mois en cours (au format 0..11), s'incrémente de 1 pour le mois suivant et le retourne à une limite de 12 via module (11% 12 == 11; 12% 12 == 0). Cela retourne le mois suivant dans le même format 0..11. La conversion dans un format que Date () reconnaîtra (1..12) est donc simple: il suffit d’ajouter 1 de nouveau.

Preuve de concept:

> for(var m=0;m<=11;m++) { console.info( "next month for %i: %i", m+1, (m+1)%12 + 1 ) }
next month for 1: 2
next month for 2: 3
next month for 3: 4
next month for 4: 5
next month for 5: 6
next month for 6: 7
next month for 7: 8
next month for 8: 9
next month for 9: 10
next month for 10: 11
next month for 11: 12
next month for 12: 1

Donc là vous l'avez.

15
Terra Ashley

Vous pouvez utiliser la bibliothèque date.js:

http://code.google.com/p/datejs/

Et juste fais ça

Date.today().next().month();

Vous aurez la valeur exacte pour aujourd'hui + 1 mois (jours compris)

5
Julio

Si vous utilisez moment.js, ils ont une fonction add . Voici le lien - https://momentjs.com/docs/#/manipulating/add/

moment().add(7, 'months');

J'ai aussi écrit une fonction récursive basée sur la réponse de paxdiablo pour ajouter un nombre variable de mois. Par défaut, cette fonction ajouterait un mois à la date du jour. 

function addMonths(after = 1, now = new Date()) {
        var current;
        if (now.getMonth() == 11) {
            current = new Date(now.getFullYear() + 1, 0, 1);
        } else {
            current = new Date(now.getFullYear(), now.getMonth() + 1, 1);            
        }
        return (after == 1) ? current : addMonths(after - 1, new Date(now.getFullYear(), now.getMonth() + 1, 1))
    }

Exemple 

console.log('Add 3 months to November', addMonths(3, new Date(2017, 10, 27)))

Sortie - 

Add 3 months to November Thu Feb 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)
2
Radha Satam

essaye ça:

var a = screen.Data.getFullYear();
var m = screen.Data.getMonth();
var d = screen.Data.getDate();

m = m + 1;
screen.Data = new Date(a, m, d);

if (screen.Data.getDate() != d)
screen.Data = new Date(a, m + 1, 0);
1
Roberto Filho

Vous pouvez probablement faire de cette façon

var currentMonth = new Date().getMonth();

var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];

for(var i = currentMonth-1 ; i<= 4; i++){
console.log(monthNames[i])// make it as an array of objects here 

}
1
Shikha thakur

ah, la beauté des ternaires:

const now = new Date();
const expiry = now.getMonth() == 11 ? new Date(now.getFullYear()+1, 0 , 1) : new Date(now.getFullYear(), now.getMonth() + 1, 1);

juste une version simplifiée de la solution fournie par @paxdiablo et @Tom

0
Mateo Marin