moyen facile d'ajouter de 1 mois à un time_t en C/C++
J'ai un code qui utilise l'Oracle de la fonction add_months pour incrémenter une Date par X le nombre de mois.
J'ai maintenant besoin de ré-appliquer la même logique à un C /C++ la fonction. Pour des raisons que je ne veux pas/besoin d'aller dans je ne peux pas simplement émettre une requête à l'oracle pour obtenir la nouvelle date.
Personne ne sait d'une manière simple et fiable de l'ajout de X nombre de mois pour un time_t?
Quelques exemples de types de calculs sont présentés ci-dessous.
30/01/2009 + 1 mois = 28/02/2009
31/01/2009 + 1 mois = 28/02/2009
27/02/2009 + 1 mois = 27/03/2009
28/02/2009 + 1 mois = 31/03/2009
31/01/2009 + 50 mois = 31/03/2013
- Comme Mehrdad Afshari points ci-après, 28/02/2009 + 1 mois = 31/03/2009 n'est pas possible avec un type simple. Comment savez-vous que 28/02/2009 est le "dernier jour du mois" et non le "28e jour du mois". Ce n'est pas codée dans le type. Vous avez besoin d'une meilleure représentation.
- Je pense que 28/02/2009 + 1 mois = 31/03/2009 est faux. Il devrait être 28/02/2009 + 1 mois = 28/03/2009. De comment .Net se comporte, les seuls exemples qui n'ont pas lieu au même jour du mois, où l'résultant mois a moins de jours que l'original mois. c'est à dire: 31/01/2009 + 1 mois = 28/02/2009
- Maintenant que j'ai relu vos exemples, il semble que ce que vous êtes vraiment la recherche est de savoir comment chercher le dernier jour du mois, à un certain moment dans le mois dans le futur, ce qui est une question légèrement différente.
- Subtil: 30/1/2009 + 1 mois + 1 mois = 28/3/2009 !
- Plus subtil encore:
30/1/2009 +1 month - 1 month = 28/1/2009
. Cela semble être une mauvaise façon de définir mois. - stimuler la date add_month effectue simplement de cette façon. Je pense que c'est étrange.
Vous devez vous connecter pour publier un commentaire.
Méthode AddMonths_OracleStyle fait ce que vous avez besoin.
Peut-être que vous voulez remplacer IsLeapYear et GetDaysInMonth à certains bibliothécaire méthodes.
Vous pouvez utiliser Coup de pouce.GregorianDate pour cela.
Plus précisément, de déterminer le mois par l'ajout de la bonne
date_duration
, et ensuite utiliserend_of_month_day()
à partir de la date d'algorithmesConvertir
time_t
àstruct tm
, ajouter X mois, ajouter mois > 12 ans, de convertir retour. tm.tm_mon est un int, l'ajout de 32000+ mois ne devrait pas être un problème.[edit] Vous pourriez trouver que la correspondance Oracle est difficile une fois que vous obtenez la plus difficile des cas, comme l'ajout de 12 mois à 29/02/2008. Les deux 01/03/2009 et 28/02/2008 sont raisonnables.
Vraiment nouvelle réponse à un vraiment vieille question!
À l'aide de ce programme gratuit et open source de la bibliothèque, et un C++14 compilateur (comme clang) je peux maintenant écrire ceci:
Et il compile.
Noter la remarquable similitude entre le code et l'OP de pseudo-code:
Également noter qu'au moment de la compilation de l'information dans conduit à compiler de l'information en temps hors.
wk
,mo
etyr
?2015_y
.month
, oui, mais pas à l'aide définis par l'utilisateur littéraux.jan
, 'fév, etc.
semaines, no. I couldn't settle on a good way to spell it. So
semaines{2}. But there is
soleil,
mon,
aut`, etc. pour les jours de la semaine.