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.
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