DateTime.AddMonths ajoutant uniquement le mois et non les jours
Disons, j'ai 28 février 2010 et ajouter un mois à cette date à l'aide de AddMonths(1)
...
la date obtenue est 28 Mars, mais pas 31 Mars, qui je veux.
Est-il un moyen de le tordre un peu si cela fonctionne sans ajout de code personnalisé?
Edit: je n'ai pas besoin de le dernier jour d'un mois, en fait j'ai besoin d'ajouter un mois, mais lors de son dernier jour d'un mois, j'ai besoin de trouver le dernier jour du mois suivant.
source d'informationauteur grady
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas ce que vous voulez atteindre, mais vous pouvez ajouter un jour, ajouter un mois et soustraire un jour.
MODIFIER:
Comme l'un des commentateurs ont fait remarquer, cela donne parfois le mauvais résultat. Après la lecture de mise à jour de votre question, je pense que la façon la plus simple de calculer la date à laquelle vous souhaitez est:
Cette extension de la méthode retourne le mois prochain la date du jour. Lorsque la date du jour est le dernier jour du mois, il sera de retour le dernier jour du mois suivant.
Si vous voulez dire que la date résultante doit être à la même distance de la fin du mois, alors vous êtes dans le code personnalisé - quelque chose comme (pas entièrement testé, surtout de re 28/30/31 mois):
Comment quelque chose comme ceci? Il résout le 30 janvier problème qui pourrait se produire avec la meilleure réponse.
Ce code permet d'ajouter le nombre de mois et de passer à la dernière journée de la cible mois si la date du jour est le dernier jour du mois en cours. Notez qu'il y a fondamentalement pas de solution pour le problème du 30 janvier sans faire du sur mesure dates:
Si la date est le seul état, alors peu importe la façon dont vous gérez un mois en avance à partir de 30 janvier, vous avez plus qu'à choisir si vous interpréter le résultat comme le dernier jour de février ou tout simplement de la 28 du mois en cours. Vous ne pouvez pas avoir les deux depuis la date du jour est votre seul état. Il n'y a pas de "drapeau" qui vous dit que cette 28 février était à l'origine le seul dernier jour en janvier.
Effectivement, cela signifie que Jan30.AddMonthsCustom(1).AddMonthsCustom(1) != Jan30.AddMonthsCustom(2), et que finalement tout 30, 29 et 28 date se termine le dernier jour du mois si vous continuez à se propager.
Si je suis cependant mal, s'il vous plaît laissez-moi savoir. Je voudrais vraiment avoir cette résolu.
Ce rashleighp proposé est presque correct, mais ne fonctionne pas pour, par exemple, l'ajout de 1 mois à 2016-02-29 (le résultat devrait être 2016-03-31) ou 2017-02-28 (le résultat devrait être 2017-03-31)
Cette version modifiée devrait fonctionner, y compris tous les cas spéciaux.
Tous les tests NUnit ci-dessous est passé:
Pas - il ne pas en tenir compte. C'est un code personnalisé!
Votre code ne seront intéressés par le dernier jour du mois, ou voulez-vous un code pour ajouter un mois de date, mais prendre en compte lors de la date fournie est le dernier jour du mois?
Je l'ai résolu maintenant, en vérifiant si c'est le dernier jour d'un mois à l'aide de GetLastDayInCurrentMonth. Si c'est le cas, j'utilise
Si ce n'est pas le dernier jour, je viens d'utiliser AddMonths(1)
Merci les gars!
Quoi à ce sujet? Il peut ajouter autant de mois que vous le souhaitez dans une méthode d'extension -- c'est à dire
dateDue.AddSmarthMonths(6);
- et considère n'importe quel jour de janvier, après 28 "le dernier jour du mois".vous pouvez essayer ce
Cela va ajouter numMonths à someDate et, si someDate est fin de mois, la valeur de retour sera en fin de mois, sinon il juste ne AddMonths(numMonths)
Donne le dernier jour dans les prochains mois en une seule ligne:
(Les opérations sont: arriver le premier jour du mois en cours (= 1.Le 10 Février), Ajouter 2 Mois (= 1. Apr 10), la Soustraction de 1 ms (= 31. Mar 10), en Option délai de coupure
Essayer de surcharger le jour de la propriété et la valeur 32. Whgen c'est fait en JavaScript, je crois que la valeur par défaut est de retour pour le dernier jour de ce mois, vous êtes dans.