Existe-t-il un moyen "standard" ou le mieux que je puisse faire est de le calculer directement en soustrayant de gregorian::date(1970,1,1)
?
time_t
Est le type utilisé pour conserver le temps en secondes (généralement le temps Epoch). Je suppose que vous êtes après le temps d'Epoch, si c'est le cas, je ne suis pas au courant de la manière d'obtenir le temps d'Epoch directement, à part la soustraction que vous avez déjà. Une fois que vous avez un time_duration
(Résultat de la soustraction), vous pouvez appeler total_seconds()
sur la durée et l'enregistrer dans time_t
.
btw. si vous êtes après le temps d'Epoch, vous pouvez simplement utiliser gettimeofday()
et vous éviter des maux de tête!
Puisque la méthode de @ icecrime convertit deux fois (ptime utilise une représentation linéaire en interne), j'ai décidé d'utiliser à la place le calcul direct. C'est ici:
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);
}
EDIT: Merci @jaaw d'avoir porté cela à mon attention. Depuis le boost 1.58, cette fonction est incluse dans date_time/posix_time/conversion.hpp
, std::time_t to_time_t(ptime pt)
.
Voici une variante de la méthode de @ ybungalobill qui vous fera dépasser 2038, au cas où. :)
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());
}
Ces 2 lignes devraient le faire.
tm td_tm = to_tm(pt);
time_t tt = mktime(&td_tm);