9
votes

Classe DateTime C ++

J'ai mon propre C ++ DateTime défini comme suit: xxx

J'ai 2 DateTime que j'ai besoin de comparer pour voir lequel L'un est supérieur à (plus récent) l'autre.

existe-t-il gratuitement disponible C ++ DateTime la classe que je peux utiliser pour

  1. Convertissez ma classe DateTime en classe DateTime
  2. Leur classe devrait fournir <,>, <=,> = olfectateurs de comparaison

    Si un exemple concret pourrait être fourni qui serait génial. Notez que j'ai besoin de comparer à millisecond.

    Je pensais à boost ou qt . Préféré boost cependant.


6 commentaires

Si vous avez votre propre classe, pourquoi avez-vous besoin d'un autre?


Ou plus important encore, si vous allez utiliser la classe de quelqu'un d'autre, pourquoi l'utiliser uniquement pour des comparaisons? Il suffit d'utiliser leur classe. Le travail est fait pour vous. Fossé votre classe.


La raison en est que ma demande est une bibliothèque C ++ que d'autres applications utiliseront. 1) Je ne veux pas qu'ils devraient inclure des bibliothèques de booster pour qu'ils utilisent ma bibliothèque. 2) Cette classe DateTime a déjà été utilisée dans de nombreux endroits d'un système hérité. Merci pour les commentaires cependant.


Eh bien, réinventer la roue est mauvais: | S'ils peuvent utiliser votre bibliothèque, ils peuvent utiliser Boost.


Ouais..je souhaite aussi. La chose à propos de boost est que c'est tellement grand. Tant de dossiers, et les fichiers .lib sont énormes (je suis sur Windows). C'est pourquoi je ne veux pas qu'ils incluent Boost.


Eh bien, vous pouvez extraire le dossier dont vous avez besoin et la plupart sont en tête-tête seulement: | Vous feriez de vos utilisateurs une bonne chose en leur montrant la lumière qui est boost . Je vais arrêter maintenant :)


8 Réponses :


19
votes

voir Boost Date Date Library

et votre classe ressemble beaucoup à struct TM

EDIT: Vous avez raison que la structure TM ne prend pas en charge la précision de milliseconde.

Regardez à un Boost exemple . Est-ce que cela aide?



3
votes

Qu'est-ce qui ne va pas à utiliser le contenu de pour la mise en œuvre de votre classe? C'est standard C90.


2 commentaires

Rien ne va pas avec ça ... pourriez-vous s'il vous plaît peut-être donner un exemple de comment je pourrais continuer à utiliser ?


Ceci est C ++. Cela devrait être #include




5
votes

Je ne sais aucun de la tête. Mais j'envisagerais de réécrire votre classe de date à contenir un entier unique de 64 bits décrivant des millisecondes depuis l'époque conventionnelle (1970 étant-ce?). Ensuite, vous êtes libre de diviser simplement par 1000 et d'utiliser les fonctions CRT normales pour le formatage en tant que chaîne, plus vous pouvez prendre la valeur MODULO 1000 pour obtenir la partie milliseconde.

Les opérateurs de comparaison deviennent ensuite faciles ..


2 commentaires

Je recommanderais quelque chose comme ça. Conservez les temps en interne comme un entier comme celui-ci afin que les comparaisons soient faciles, puis fournissent des accesseurs pour obtenir les différentes parties de l'heure de panne (heure, mois, etc.). Si l'efficacité est une préoccupation, vous pouvez mettre en cache le temps décomposé jusqu'à ce que l'heure interne soit modifiée, de sorte que vous n'avez pas à conserver l'année pour obtenir le mois, etc.


C'est-à-dire que si vous ne prévoyez pas d'utiliser Boost.



8
votes

Vous voudrez peut-être consulter qdateTime de qt, ce qui a les opérateurs requis et Précision ms.

La conversion de votre classe pourrait être effectuée via xxx

l'autre solution est similaire; -)


0 commentaires

1
votes

gnu r utilise un remplacement de struct TM avec une précision microseconde - au lieu de secondes (entier), car l'époque, elle utilise désormais un numéro de point flottant. C'est vraiment vraiment utile. Pour beaucoup de mes applications, je viens de doubler et d'obtenir les conversions de temps. Voir R-2.9.1 / SRC / Main / DateTime.c dans les sources R en cours.

Ayant cela dans une classe autonome C ++ serait pratique.


0 commentaires

4
votes

D'accord, voici l'extrait de code final qui répond à ma propre question. J'ai pensé à partager cela au cas où cela pourrait être utile à d'autres personnes à l'avenir. Grâce à Fred Larson de pointer l'exemple de boost.

J'ai choisi Boost pour faire le calcul DateTime parce que ma demande utilise déjà un coup de pouce ailleurs. Je pense que j'aurais peut-être pu utiliser Qt aussi, bien que je ne puisse pas confirmer complètement.

supposant que la datetétime est définie comme suit: xxx

Pour effectuer une simple comparaison de dateTime xxx

pour ajouter 2 DateTime ensemble pour renvoyer une nouvelle heureTetime xxx


0 commentaires

5
votes

Je félicite des dates de stockage de grégoriennes il y a des âges. Je stocke les dates comme un entier de 32 bits (en quelque sorte comme une date julienne). La date est donc composée (année * 1000) + doy (Doy est le jour de l'année). C'est à dire. - 2009001 est le 1er janvier 2009 - 2009365 est le 31 décembre 2009

Ma catégorie de date de la date fournit des méthodes pour obtenir l'année, le mois et la journée, l'ajout, la soustraction, l'incrémentation et la décrémentation, en comparant, à obtenir le nombre de jours entre les dates, etc.

Pour la date et l'heure, j'utilise 64 bits flotteurs où la partie entière du nombre réel est la même que celle des dates entier (Julian comme) décrites ci-dessus, et la fraction représente le temps en fraction d'une journée.

I.e.

  • 2009001.041666666666 ~ est le 1 2009 janvier 1:00 AM
  • 2009001.06249999999 ~ est le 1 2009 janvier 1h30
  • 2009001.958333333333 ~ est le 1 2009 à 23 h 21:00

    Si vous n'avez besoin que de précision minute, vous pouvez utiliser 32 bits flottants pour la date et l'heure, mais vous ne pouvez pas adéquatement avec précision stocker des secondes et des millisecondes.

    Les avantages des dates de stockage (et du temps) de cette manière sont les suivants:

    • Vous n'avez besoin que de 8Bans pour représenter les données et l'heure par rapport à 22bytes (en supposant des entiers 32 bits) utilisé par la classe DateTime dans la question.

    • comparé aux dates stockées comme secondes d'une époque, Lorsque vous regardez le nombre (par exemple dans le débogueur) vous pouvez plus ou moins identifier de le nombre l'année et le jour de l'année et la période approximative de la journée (Pour obtenir l'heure, minute, deuxième après minuit simplement de 24, 1440, 86400 respectivement).

    • comparer les dates est triviale, comparativement simplement les numéros (Une seule opération de la CPU par rapport à celle-ci prendrait pour l'exemple DateTime).

    • Moins d'opérations de comparaison à faire à ce jour arithmétique.

      L'inconvénient de ceci (pour le temps) est une légère perte de précision (c'est pratiquement un point de muet) et vous devez faire une simple arrondie pour obtenir de belles valeurs entières lors de la conversion des valeurs entière des heures et des secondes.


0 commentaires