c++ - ¿Cómo convierto boost:: posix_time:: ptime a time_t?
boost-date-time (5)
¿Hay alguna forma "estándar" o lo mejor que puedo hacer es calcularla directamente restando de gregorian::date(1970,1,1)
?
Aquí hay una variación del método de @ ybungalobill que lo hará pasar más allá de 2038, por las dudas. :)
int64_t rax::ToPosix64(const boost::posix_time::ptime& pt)
{
using namespace boost::posix_time;
static ptime epoch(boost::gregorian::date(1970, 1, 1));
time_duration diff(pt - epoch);
return (diff.ticks() / diff.ticks_per_second());
}
Dado que el método de @ icecrime se convierte dos veces (ptime usa la representación lineal internamente), he decidido usar el cálculo directo en su lugar. Aquí está:
time_t to_time_t(boost::posix_time::ptime t)
{
using namespace boost::posix_time;
ptime epoch(boost::gregorian::date(1970,1,1));
time_duration::sec_type x = (t - epoch).total_seconds();
// ... check overflow here ...
return time_t(x);
}
EDITAR: Gracias, @jaaw por traer esto a mi atención. Desde el impulso 1.58, esta función está incluida en date_time/posix_time/conversion.hpp
, std::time_t to_time_t(ptime pt)
.
Estas 2 líneas deberían hacerlo.
tm td_tm = to_tm(pt);
time_t tt = mktime(&td_tm);
time_t
es el tipo utilizado para mantener el tiempo en segundos (por lo general, tiempo de época). Supongo que estás después del tiempo de la época, si es así, no estoy al tanto de ninguna forma de aumentar el tiempo de época directamente, aparte de la resta que ya tienes. Una vez que tiene un time_duration
(resultado de la resta), puede llamar a total_seconds()
en la duración y almacenarlo en time_t
.
por cierto. si buscas tiempo de época, puedes usar gettimeofday()
y ahorrarte un dolor de cabeza.