2009-10-14 4 views
6

J'ai découvert un résultat étrange dans la bibliothèque de dates Boost C++. Il y a une incohérence entre microsec_clock et second_clock, et je ne comprends pas pourquoi. J'utilise Windows XP 32 bitsBoost C++ date_time microsec_clock et second_clock

Mon petit bout de code:

using namespace boost::posix_time; 
... 
ptime now = second_clock::universal_time(); 
std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; 
ptime now_2 = microsec_clock::universal_time(); 
std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; 
... 

La version imprimée que je m'y attendais sont temps en cours sans miliseconds et milliseonds. Cependant, ce que j'ai dans mon pc est:

 
2009-10-14T16:07:38 
1970-06-24T20:36:09.375890 

Je ne comprends pas pourquoi il y a une date weired (année 1970 ???) dans mon microsec_clock temps. Documentation connexe pour Boost: link to boost date time

Répondre

5

Vous ne savez pas ce qui pourrait être mauvais pour vous; le même code fonctionne exactement pour moi.

 
$ cat > test.cc 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
using namespace boost::posix_time; 
int main() { 
    ptime now = second_clock::universal_time(); 
    std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; 
    ptime now_2 = microsec_clock::universal_time(); 
    std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; 
    return 0; 
} 
^D 
$ c++ -lboost_date_time test.cc 
$ ./a.out 
Current Time is: 2009-10-14T16:26:55 
Current Time is: 2009-10-14T16:26:55.586295 

mise en œuvre à goutte, second_clock utilise time et microsec_clock utilise gettimeofday ou GetSystemTimeAsFileTime dessous, en fonction de la plate-forme. Quelque chose ne va pas avec votre plate-forme - quel est votre système d'exploitation et votre version?


Quelle est votre version de Boost? Si elle est égale ou inférieure à 1,38, passez à la version 1,39 ou appliquez le correctif manuellement à #2809.

 
--- boost/date_time/filetime_functions.hpp (revision 53621) 
+++ boost/date_time/filetime_functions.hpp (revision 53622) 
@@ -96,9 +96,7 @@ 
    { 
     /* shift is difference between 1970-Jan-01 & 1601-Jan-01 
     * in 100-nanosecond intervals */ 
-  const uint64_t c1 = 27111902UL; 
-  const uint64_t c2 = 3577643008UL; // issues warning without 'UL' 
-  const uint64_t shift = (c1 << 32) + c2; 
+  const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008 

     union { 
      FileTimeT as_file_time; 

de Windows FileTime a un décalage différent de temps UNIX, et le code qui était en avant Boost ne générerait pas la différence de décalage correct dans certains compilateurs optimiseurs.

+0

J'utilise le système Win32, Windows XP SP2 32 bits pour être exact. – Lily

+0

J'utilise déjà 1.39 avec Eclipse 3.4.1 et MingW 3.4. Aussi, j'ai l'avertissement: Description de \t ressources \t Chemin \t Localisation \t type C: nombre de changement de /boost/boost_1_39/boost/date_time/filetime_functions.hpp gauche> = largeur de la ligne CommercialDetection Type C/C++ problème comme bien – Lily

+0

Hmm, je pensais que ce correctif était en 1.39 mais je peux vérifier. – ephemient

1

La date 1970 vient très probablement de la façon dont unix time est représentée, en secondes à partir du 1er Janvier 1970. Je suppose qu'il est peut-être devient en quelque sorte le temps de fonctionnement du système en millisecondes et de l'interpréter en secondes depuis 1/1/1970. Une disponibilité d'un peu plus de 4 heures viendrait avec cette date.

1

Contrairement second_clock, la documentation microsec_clock::universal_time mentionne: Renvoie l'heure UTC en fonction des paramètres de l'ordinateur .
Vous devriez vérifier vos paramètres d'horloge matérielle (ou d'où microsec obtient ses valeurs).

modifier:
Si ce ne est pas lié à vos ordinateurs réglages de paramètres devrait être un mauvais comportement en coup de fouet, que je doute fortement.

+0

Très bon point, et j'ai également trouvé ceci: Obtenez l'heure UTC en utilisant une sous-seconde résolution d'horloge. Sur les systèmes Unix, ceci est implémenté en utilisant GetTimeOfDay. Sur la plupart des plates-formes Win32, il est implémenté en utilisant ftime. Les systèmes Win32 n'atteignent souvent pas une résolution de microsecondes via cette API. Si une résolution plus élevée est critique pour votre application, testez votre plate-forme pour voir la résolution obtenue. J'utilise le système Win32, donc peut-être il n'y a pas une telle résolution du tout dans mon PC. Cela pourrait être la raison. Cependant, l'impression m'a donné une date, alors d'où viennent ces chiffres? ... – Lily

+0

En termes d'implémentation, il génère un time_type à partir de la date actuelle et ftime() dans create_time() si je le vois bien. –

+0

Et si ftime() ne supporte pas la résolution de seconde sous je m'attends à perdre la haute résolution et un repli vers la résolution de la meilleure qualité. –

Questions connexes