Algorithme pour ajouter ou soustraire des jours à compter d'une date?
Je suis en train d'écrire une classe Date dans une tentative pour apprendre le C++.
Je vais essayer de trouver un algorithme permettant d'ajouter ou de soustraire des jours à une date, où le Jour commence à partir de 1 Mois et commence à partir de 1. Il s'avère être très complexe, et google ne tourne pas beaucoup,
Quelqu'un sait-il d'un algorithme qui fait cela?
Je suis étonné de voir que cette question existe sans un accompagnement "Utiliser Boost" réponse avec un lien vers la documentation.
OriginalL'auteur bcoughlan | 2010-02-26
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple est d'écrire deux fonctions, l'une qui convertit le jour à un certain nombre de jours entre une date de début, puis une autre qui les convertit à une date. Une fois que la date est exprimée en nombre de jours, il est facile d'ajouter ou de soustraire à elle.
Vous pouvez trouver les algorithmes ici: http://alcor.concordia.ca/~gpkatch/gdate-algorithm.html
malheureusement, ces fonctions ne sont pas très précis... ou au moins quand je compare mes résultats de wolfram alpha, j'ai été un jour ou deux.
Ici: home.roadrunner.com/~hinnant/date_algorithms.html sont des algorithmes qui sont précis. Leur validité a été testé pour être précis sur un calendrier gregorien dans la plage de +/- 5,8 millions d'années à partir de 32 bits de l'arithmétique. Ils comptent les jours avant ou après 1970-01-01.
qui ressemble à une grande ressource, merci. Une simplification que vous pourriez faire est de supprimer le
-1
dedoy
laisser la gamme de[1, 366]
puis soustraire719469
au lieu de719468
à la fin pour compenser.Depuis que j'ai écrit le commentaire ci-dessus, j'ai dû déplacer mon site personnel. Ma date algorithmes sont maintenant ici: howardhinnant.github.io/date_algorithms.html j'ai aussi remarqué que le
d(g)
fonction de alcor.concordia.ca/~gpkatch/gdate-algorithm.html ne semble pas retourner à l'inverse de l'g(y,m,d)
. Peut-être que je venez de programmer jusqu'à tort, mais je n'ai pas encore trouvé mon erreur.OriginalL'auteur Mark Ransom
Vous n'avez pas vraiment besoin d'un algorithme en tant que tel (au moins pas quelque chose digne de ce nom), de la bibliothèque standard peut faire la plupart des charges lourdes; calendrier des calculs sont notoirement difficiles. Tant que vous n'avez pas besoin de dates antérieures à 1900, puis:
Exemple d'utilisation:
Va bondir secondes gâcher ce calcul?
Une bonne question; le temps UNIX époque est à partir du 1er janvier 1970, et ne compte pas les secondes intercalaires. Cependant, le réglage de la valeur nominale de l'heure du jour à midi permettra d'éviter tout problème potentiel de plusieurs dizaines de milliers d'années.
OriginalL'auteur Clifford
Je suppose que c'est pour certains une sorte d'exercice, sinon, vous devez utiliser un temps de classe qui est déjà fourni.
Vous pouvez stocker votre temps comme le nombre de millisecondes depuis une certaine date. Et puis, vous pouvez ajouter de la valeur appropriée et de convertir que de la date de l'appel de la accesseurs de la classe.
OriginalL'auteur Brian R. Bondy
Voici une esquisse d'une approche très simple. Pour des raisons de simplicité d'idées, je vais supposer que
d
, le nombre de jours à ajouter, est positif. Il est facile d'étendre le ci-dessous pour les cas oùd
est négatif.Soit
d
est de moins de 365 oud
est supérieure ou égale à 365.Si
d
est inférieure à 365:Si
d
est supérieure à 365:Sinon, vous pouvez exprimer la date, disons, Julian forme et puis suffit d'ajouter à la Julian forme et la conversion de format ymd.
OriginalL'auteur jason
Une approche à la carte de la date de l'Julian nombre de la date, de faire vos opérations sur entiers, et de transformer retour.
Vous trouverez beaucoup de ressources pour l'julian fonctions.
OriginalL'auteur Dirk Eddelbuettel
Essayer cette fonction. Il calcule correctement les additions ou les soustractions. dateTime argument doit être au format UTC.
Et il y a des exemple d'utilisation:
OriginalL'auteur Eldar Agalarov
Je suggère d'écrire d'abord une routine qui convertit année-mois-jour en un certain nombre de jours depuis la date fixe, disons, depuis 1.01.01. Et une symétrique routine qui permettrait de convertir retour.
N'oubliez pas de processus d'années bissextiles correctement!
Avoir ces deux, votre tâche serait trivial.
OriginalL'auteur Vlad
Je sais que c'est une très vieille question, mais c'est intéressant, et quand il s'agit de travailler avec des dates et des heures. J'ai donc pensé à partager un bout de code qui permet de calculer la nouvelle date sans l'aide de tous intégré des fonctionnalités en C++.
OriginalL'auteur SajithP