Estoy usando date_time para abstraer las peculiaridades de la plataforma. y necesito producir una resolución microsec de 64 bits uint64_t que se usará en la serialización. No entiendo lo que está mal a continuación.boost :: date_time (boost-145) usando uint de 64 bits con cálculos de microsec, sin truncamiento
#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;
}
Aquí está la salida que obtengo.
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
Cuando cambio al uso de total_seconds()
y + seconds(..)
Los problemas dissapear --i.e, de entrada cambia a:.
2010-Dec-15 18:26:22.606978
2010-Dec-15 18:26:22
fecha_hora dice que usa un 64-bit de tipo de internos, y 2^64÷ (10^6×3600×24×365) ~= 584942
incluso 2^60÷ (10^6×3600×24×365) ~= 36558
.
Las primeras líneas de Wikipedia tener esto que decir sobre el tiempo Posix
tiempo Unix, o el tiempo de POSIX, es un sistema para la descripción de los puntos en el tiempo, que se define como el número de segundos transcurridos desde medianoche Tiempo universal coordinado (GMT) del 1 de enero 1970
¿por qué es tan masivo truncamiento pasando 40 años en la línea?
¿Cómo uso el espacio completo de 64 bits con resolución de microsegundo usando boost :: date_time?
--edit1 en respuesta a hans--
El puesto se ha cambiado para reflejar la salida de número entero de los duration.total_microseconds() parte. Nota 1292576572566904 ÷ (10^6 × 3600 × 24 × 365) ~ = 40.98 años. La salida de segundos no se ha actualizado.
--edit2-- Downscaling los microsegundos a segundos antes de que la "desocialización" paso, también funciona bien. Este enfoque resolvió mi problema, solo necesito una resolución de microsegundos en la creación, y puedo vivir sin ella en la deserialización.
Todavía quiero saber qué y por qué del problema.
Tengo curiosidad también porque tengo la intención de escribir también algo que utiliza un tiempo de resolución de microsegundos de 64 bits. – Omnifarious