Boost C ++ date_time microsec_clock et second_clock
Question
J'ai découvert un résultat étrange dans la bibliothèque de date heure Boost C ++. Il y a incompatibilité entre microsec_clock
et second_clock
, et je ne comprends pas pourquoi est-ce. J'utilise Windows XP 32 bits
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 temps de microsec_clock
. Documentation connexe pour Boost: lien vers date de boost temps
La solution
Je ne sais pas ce qui pourrait être mauvais pour vous; le même code fonctionne 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
La mise en œuvre sage, second_clock
utilise time
et utilisations microsec_clock
gettimeofday
ou GetSystemTimeAsFileTime
dessous, en fonction de la plate-forme. Quelque chose semble mal avec votre plate-forme - quel est votre OS et la version
Quelle est votre version Boost? Si elle est 1,38 ou moins, passez à 1,39 ou appliquer le correctif # 2809 manuellement.
--- 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.
Autres conseils
La date 1970 vient très probablement de la façon temps unix est représentée, en secondes de du 1er janvier 1970, je dirais que peut-être il devient en quelque sorte le temps de fonctionnement du système en millisecondes et de l'interpréter en secondes depuis le 1/1/1970. Un temps de fonctionnement d'un peu plus de 4 heures serait arriver à cette date.
Contrairement à second_clock
, la documentation microsec_clock::universal_time
mentionne:. Renvoie l'heure UTC basé sur paramètres de l'ordinateur
Vous devriez vérifier vos paramètres d'horloge du matériel (ou si jamais microsecondes obtient ses valeurs de).
edit:
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.