2010-12-15 104 views
5

J'utilise date_time pour extraire les particularités de la plateforme. et j'ai besoin de produire une résolution uint64_t de 64 bits qui sera utilisée pour la sérialisation. Je ne comprends pas ce qui ne va pas.boost :: date_time (boost-145) utilisant un uint 64 bits avec des calculs microsec, sans troncature

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/cstdint.hpp> 
#include <iostream> 

using namespace boost::posix_time; 
using boost::uint64_t; 

ptime UNIX_EPOCH(boost::gregorian::date(1970,1,1)); 

int main() { 
    ptime current_time = microsec_clock::universal_time(); 

    std::cout << "original time: "<< current_time << std::endl; 

    long microsec_since_epoch = ((current_time -UNIX_EPOCH).total_microseconds()); 

    ptime output_ptime = UNIX_EPOCH + microseconds(microsec_since_epoch); 
     std::cout << "Deserialized time : " << output_ptime << std::endl; 

    std::cout << "Microsecond output: " << microsec_since_epoch << std::endl; 

    std::cout << "Microsecond to second arithmetic: " 
     << microsec_since_epoch/(10*10*10*10*10*10) << std::endl; 

    std::cout << "Microsecond to tiume_duration, back to microsecond : " << 
     microseconds(microsec_since_epoch).total_microseconds() << std::endl; 


    return 0; 
} 

Voici la sortie que je reçois.

original time: 2010-Dec-17 09:52:06.737123 
Deserialized time : 1970-Jan-16 03:10:41.577454 
Microsecond output: 1292579526737123 
Microsecond to second arithmetic: 1292579526 
Microsecond to tiume_duration, back to microsecond : 1307441577454 

Lorsque je passe à l'aide de total_seconds() et + seconds(..) Les problèmes dissapear --i.e, l'entrée change comme suit:.

2010-Dec-15 18:26:22.606978 
2010-Dec-15 18:26:22 

date_time prétend utiliser un type 64-bit à l'intérieur, et 2^64÷ (10^6×3600×24×365) ~= 584942 même 2^60÷ (10^6×3600×24×365) ~= 36558.

Les premières lignes de wikipedia ont ceci à dire au sujet du temps Posix

temps Unix, ou le temps POSIX, est un système pour décrire les points dans le temps, défini comme le nombre de secondes écoulées depuis minuit Temps universel coordonné (UTC) du 1er Janvier, 1970

Pourquoi cette troncature Massive va sur 40 ans sur toute la ligne? Comment utiliser l'espace complet de 64 bits avec une résolution de microsecondes en utilisant boost :: date_time?

--edit1 en réponse à hans--

Le poste a été modifié pour tenir compte de la sortie de nombre entier de la partie duration.total_microseconds(). Note 1292576572566904 ÷ (10^6 × 3600 × 24 × 365) ~ = 40,98 années. La sortie de secondes n'a pas été mise à jour.

--edit2-- Downscaling les microsecondes à quelques secondes avant l'étape « désérialisation », fonctionne aussi bien. Cette approche a résolu mon problème, j'ai seulement besoin de la résolution de la microseconde à la création, et je peux vivre sans la désérialisation. Je veux toujours savoir le quoi et le pourquoi du problème.

+0

Je suis curieux aussi puisque j'ai l'intention d'écrire aussi quelque chose qui utilise le temps de résolution de microsecondes de 64 bits. – Omnifarious

Répondre

2

Cela semble être un problème avec les microsecondes() ne pouvant pas gérer une entrée de microsecondes aussi importante. Le snippit suivant est une solution à ce problème:

#define MICROSEC 1000000 

uint64_t sec_epoch = microsec_since_epoch/MICROSEC; 
uint64_t mod_micro_epoch= microsec_since_epoch % MICROSEC; 

ptime new_method = UNIX_EPOCH + seconds(sec_epoch) + microseconds(mod_micro_epoch); 

std::cout << "Deserialization with new method: " << new_method << std::endl; 
1

Le type de retour pour total_microseconds() est tick_type, pas long. On dirait que vous compilez ceci avec un compilateur qui a un type long de 32 bits. Beaucoup à petit pour stocker 40 ans de microsecondes.

+0

Serveur 64 bits ubuntu: /. ajoute l'entier issu de total_microseconds(); est réellement correct. 40,98 années de microsecondes. Je vais modifier le programme ci-dessus pour illustrer cela quand je me mets au travail. Je ne serais pas surpris si les choses sont tronquées à l'époque + microseconde. –

+0

Mise à jour de mon message pour vous montrer ce qui sort de total_microsecondes. –