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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top